You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

go-pg关联查询如何包含软删除的pipeline_triggers数据

解决go-pg关联查询中保留软删除PipelineTrigger数据的问题

方案一:自定义JOIN条件

直接通过Join方法手动编写关联的ON条件,绕过ORM自动生成的软删除过滤规则:

var events []PipelineTriggerEvent
err := db.Model(&events).
    Columns("event.*", "trigger.*").
    Join("JOIN pipeline_triggers AS trigger ON trigger.id = event.trigger_id").
    Select()

通过显式指定JOIN条件,不添加trigger.deleted_at IS NULL过滤,即可获取包含软删除状态的pipeline_triggers数据,同时要通过Columns明确查询主模型和关联模型的字段。

方案二:针对关联模型单独启用WithDeleted()

利用go-pg的Relation回调,仅对关联的PipelineTrigger模型取消软删除过滤,不影响主模型:

var events []PipelineTriggerEvent
err := db.Model(&events).
    Relation("Trigger", func(q *pg.Query) (*pg.Query, error) {
        return q.WithDeleted(), nil
    }).
    Select()

这个方式更贴合ORM的设计逻辑,回调函数中给关联模型添加WithDeleted()后,JOIN子句就不会自动生成trigger.deleted_at IS NULL的过滤条件,完美匹配需求。

方案三:临时禁用关联模型的软删除钩子(不推荐)

如果前两种方案无法满足需求,可以临时禁用PipelineTrigger模型的软删除钩子,但此方法会全局影响该模型的查询行为,需谨慎使用:

// 保存原软删除钩子
originalHook := new(PipelineTrigger).BeforeDelete
// 临时禁用钩子
new(PipelineTrigger).BeforeDelete = nil

// 执行关联查询
var events []PipelineTriggerEvent
err := db.Model(&events).Relation("Trigger").Select()

// 恢复原钩子
new(PipelineTrigger).BeforeDelete = originalHook

内容的提问来源于stack exchange,提问作者ravi kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:10:27