ホームページ  >  記事  >  バックエンド開発  >  論理的に削除された行を含む結合句

論理的に削除された行を含む結合句

PHPz
PHPz転載
2024-02-08 20:42:20719ブラウズ

包含软删除行的 Join 子句

質問の内容

テーブルの 1 つである go-pg orm を使用して正しい結合選択クエリを生成するのに苦労しています。レコードは論理的に削除できますが、他の 2 つのテーブル レコードは削除できません。

データベーステーブル:

パイプライン_インスタンス
instance_id int
パイプライン_id int
イベントID int
パイプライン_トリガー
id ​​int
パイプライン_id int
削除済み_タイムスタンプ
パイプライン_トリガー_イベント
イベントID int
trigger_id int

go-pg モデル:

リーリー

私が生成しようとしているクエリ:

リーリー

go-pg orm によって生成されたクエリ:

リーリー リーリー

上記の 3 つのテーブル/モデルのうち、pipeline_triggers テーブルのみに論理的な削除用の deleted_at 列があります。私の要件は、論理的に削除された Pipeline_triggers 行も結果セットに含めることです。ただし、go-pg orm は、trigger.deleted_at is null 条件を join 句に自動的に追加します。この条件を削除して、論理的に削除された行を含むすべての行を取得するにはどうすればよいですか。

allwithdeleted 関数を使用してみましたが、メイン モデルである Pipeline_trigger_events では機能しますが (テーブルにはとにかく delete_at 列がありません)、 pipeline_triggers では機能しないため、次のように失敗します。このエラー: pg:model=pipelinetriggerevent はソフト削除をサポートしていません


正解


pg-go のコードをしばらく閲覧した後、あなたがやりたいことをサポートするかどうかはわかりません。これを確認するには、デバッガーで以下のコードをステップ実行する必要がある場合があります。

結合用のクエリを作成する場合、クエリには次の部分があります:

https://github.com/go -pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l283

リーリー

j.appendalias(b) 行は、次の appendalias() 関数を呼び出します。 https://github.com/go-pg/ pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l200

リーリー

すべての結合には 1 対 1 の親関係があるため、すべてのテーブルに追加されます。 https://github.com/go-pg/ pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l153

リーリー

これを回避するには、他の 2 つの関係ではなく、親関係に対してのみ appendalias() を呼び出すことだと思いましたが、pg-go はこれをサポートしていないようです。

これを行うには、pg.query() または pg.querywithcontext() を呼び出し、上記の SQL ステートメントを渡すだけです。

pg-go/pg はメンテナンス モードにあるため、これをサポートする可能性は低いことにも言及する価値があります。このプロジェクトが pg-go にどの程度定着しているかによっては、現在開発が進められている bun の使用を検討することもできます。

###付録###

これは、上記の最初のコード スニペットで呼び出される

appendsoftdelete()

関数です:

https://github.com/go -pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l189

リーリー

以上が論理的に削除された行を含む結合句の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。