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

