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

如何在GORM中将company_id条件置于OR分组条件之外?

GORM 如何将条件置于OR分组条件之外

在使用GORM开发时,遇到了条件分组的问题:当前代码生成的SQL中,company_id条件被包含在OR分组内,但期望将其置于OR分组外,与deleted_at条件同级。

当前代码

func Abc(db *gorm.DB) *gorm.DB {
  return db.Where("company_id = ?", "j37977c5-0825-481f-b472-2g2gc234cbc5")
}

salesman := new(Salesman)

db.Scopes(
   Abc,
).Where(
   db.Where(
        "code LIKE ?",
            "%"+val+"%",
        ).Or(
            "name LIKE ?",
            "%"+val+"%",
        ).Or(
            "active",
            val,
        ).Or(
            "join_on",
            val,
        ),
).Find(salesman)

生成的不符合预期的SQL

SELECT *
FROM `salesmen`
WHERE
(
 code LIKE '%0%'
 OR name LIKE '%0%'
 OR active = '0'
 OR join_on = '0'
 AND company_id = 'j37977c5-0825-481f-b472-2g2gc234cbc5'
)
AND deleted_at IS NULL

期望的SQL

SELECT *
FROM `salesmen`
WHERE
(
  code LIKE '%0%'
  OR name LIKE '%0%'
  OR active = '0'
  OR join_on = '0'
)
AND company_id = 'j37977c5-0825-481f-b472-2g2gc234cbc5'
AND deleted_at IS NULL

解决方案

问题出在你将带OR条件的DB对象直接传入Where,导致Scopes中的company_id被合并到OR分组内。要实现预期的SQL结构,需要使用闭包形式的Where来包裹OR条件,这样GORM会将闭包内的OR条件作为独立分组,外部的company_id条件则会与该分组并列。

修改后的代码:

func Abc(db *gorm.DB) *gorm.DB {
  return db.Where("company_id = ?", "j37977c5-0825-481f-b472-2g2gc234cbc5")
}

salesman := new(Salesman)

db.Scopes(Abc).Where(func(tx *gorm.DB) *gorm.DB {
    return tx.Where("code LIKE ?", "%"+val+"%").
        Or("name LIKE ?", "%"+val+"%").
        Or("active = ?", val).
        Or("join_on = ?", val)
}).Find(salesman)

验证生成的SQL

SELECT *
FROM `salesmen`
WHERE company_id = 'j37977c5-0825-481f-b472-2g2gc234cbc5'
AND (
  code LIKE '%0%'
  OR name LIKE '%0%'
  OR active = '0'
  OR join_on = '0'
)
AND deleted_at IS NULL

闭包内的条件会被GORM自动包裹为一个括号分组,而Scopes中的company_id条件则作为独立的WHERE子句,与OR分组、deleted_at条件同级,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:17:17