Saya menghadapi masalah menjana pertanyaan join pilih yang betul menggunakan go-pg
orm, salah satu rekod jadual boleh dipadam lembut tetapi 2 rekod jadual yang lain tidak boleh.
Jadual pangkalan data:
kejadian_paip |
---|
instance_id int |
pipeline_id int |
event_id int |
pipeline_triggers |
---|
id int |
pipeline_id int |
dipadam_pada cap masa |
peristiwa_pencetus_paip |
---|
event_id int |
trigger_id int |
go-pg Model:
type pipelinetriggerevent struct { tablename struct{} `pg:"pipeline_trigger_events,alias:pte"` trigger *pipelinetrigger `pg:"rel:has-one,join_fk:id"` pipelineinstance *pipelineinstance `pg:"rel:has-one,join_fk:event_id"` *triggerevent } type pipelinetrigger struct { tablename struct{} `pg:"pipeline_triggers,alias:pt"` *trigger } type pipelineinstance struct { tablename struct{} `pg:"pipeline_pipeline_instances,alias:ppi"` *pipelineinstance }
Pertanyaan yang saya cuba hasilkan:
select pte.*, trigger.*, pipeline_instance.* from pipeline_trigger_events as pte left join pipeline_triggers as trigger on (trigger.id = pte.trigger_id) left join pipeline_pipeline_instances as pipeline_instance on pipeline_instance.event_id = pte.event_id and trigger.pipeline_id = pipeline_instance.pipeline_id
Pertanyaan yang dijana oleh go-pg orm:
select pte.*, trigger.*, pipeline_instance.* from pipeline_trigger_events as pte left join pipeline_triggers as trigger on (trigger.id = pte.trigger_id) and trigger.deleted_at is null -- this is the unwanted line. left join pipeline_pipeline_instances as pipeline_instance on pipeline_instance.event_id = pte.event_id and trigger.pipeline_id = pipeline_instance.pipeline_id
var triggerevents []pipelinetriggerevent q := db.model(&triggerevents). column("pte.*"). relation("trigger"). relation("pipelineinstance", func(q *orm.query) (*orm.query, error) { q = q.join(" and trigger.pipeline_id = pipeline_instance.pipeline_id") return q, nil })
Daripada semua 3 jadual/model yang dinyatakan di atas, hanya jadual pipeline_triggers mempunyai lajur deleted_at
untuk pemadaman lembut. Keperluan saya ialah memasukkan baris pipeline_triggers yang dipadam lembut dalam set hasil juga. Tetapi deleted_at
列。我的要求是将软删除的 pipeline_triggers 行也包含在结果集中。但是 go-pg
orm 会自动在 join
子句中添加 trigger.deleted_at is null
orm secara automatik akan menambah syarat trigger.deleted_at is null
dalam klausa join
. Bagaimanakah saya boleh mengalih keluar keadaan ini dan mendapatkan semua baris termasuk baris yang dipadam lembut.
Saya cuba menggunakan fungsi allwithdeleted, tetapi ia berfungsi untuk model utama, iaitu pipeline_trigger_events (dan jadual tidak mempunyai lajur deleted_at), tetapi bukan untuk pipeline_triggers
, jadi ia gagal dengan ralat ini:
pg: model=pipelinetriggerevent 不支持软删除
Setelah melihat sedikit kod pg-go, saya tidak tahu sama ada apa yang anda mahu lakukan disokong. Untuk menentukan ini, anda mungkin perlu melangkah melalui kod di bawah dalam penyahpepijat.
Apabila membina pertanyaan untuk gabungan, ia mempunyai bahagian berikut:
https://github.com/go -pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l283
if issoftdelete { b = append(b, " and "...) b = j.appendalias(b) b = j.appendsoftdelete(b, q.flags) }
j.appendalias(b)
行调用以下 appendalias()
Fungsi:
https://github.com/go-pg/ pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l200
func appendalias(b []byte, j *join) []byte { if j.hasparent() { b = appendalias(b, j.parent) b = append(b, "__"...) } b = append(b, j.rel.field.sqlname...) return b }
Memandangkan semua penyertaan mempunyai hubungan ibu bapa satu dengan satu, ia ditambahkan untuk semua jadual: https://github.com/go-pg/ pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l153
func (j *join) hasparent() bool { if j.parent != nil { switch j.parent.rel.type { case hasonerelation, belongstorelation: return true } } return false }
Saya fikir penyelesaian untuk masalah ini adalah dengan menghubungi appendalias()
hanya untuk hubungan ibu bapa dan bukan dua yang lain, tetapi nampaknya pg-go tidak menyokong perkara ini.
Untuk melakukan ini, anda hanya perlu memanggil pg.query()
或 pg.querywithcontext()
dan masukkan pernyataan sql yang terkandung di atas.
Perlu juga dinyatakan bahawa pg-go/pg berada dalam mod penyelenggaraan, jadi tidak mungkin mereka akan menyokong perkara ini. Bergantung pada tahap tertanam projek ini dalam pg-go, anda mungkin mempertimbangkan untuk menggunakan bun yang sedang dalam pembangunan aktif.
Lampiran
Ini ialah fungsi appendsoftdelete()
yang dipanggil dalam coretan kod pertama di atas:
https://github.com/go -pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l189
func (j *join) appendSoftDelete(b []byte, flags queryFlag) []byte { b = append(b, '.') b = append(b, j.JoinModel.Table().SoftDeleteField.Column...) if hasFlag(flags, deletedFlag) { b = append(b, " IS NOT NULL"...) } else { b = append(b, " IS NULL"...) } return b }
Atas ialah kandungan terperinci Sertai klausa dengan baris yang dipadam lembut. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!