Sertai klausa dengan baris yang dipadam lembut

PHPz
Lepaskan: 2024-02-08 20:42:20
ke hadapan
700 orang telah melayarinya

包含软删除行的 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
}
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk
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
        })
Salin selepas log masuk

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)
    }
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

Atas ialah kandungan terperinci Sertai klausa dengan baris yang dipadam lembut. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!