Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Sertai klausa dengan baris yang dipadam lembut

Sertai klausa dengan baris yang dipadam lembut

PHPz
PHPzke hadapan
2024-02-08 20:42:20719semak imbas

包含软删除行的 Join 子句

Kandungan soalan

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 不支持软删除


Jawapan betul


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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam