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
相关产品推荐
相关产品推荐

