Laravel Eloquent中When子句内多Or查询的SQL分组问题
解决Laravel Eloquent when子句中分组OR查询的问题
问题核心是SQL逻辑运算符优先级:and优先级高于or,原代码生成的SQL会先执行shop_id = 1 and bank_name like ...,再和后续or条件做逻辑判断,不符合“shop_id匹配且任意搜索字段匹配”的需求。
无需使用子查询,只需在when闭包内部用额外的where闭包包裹所有orWhere条件,Eloquent会自动为这部分条件添加括号,实现分组逻辑:
bank::where('shop_id', $shopId) ->when($search !== "", function ($query) use ($search) { return $query->where(function ($subQuery) use ($search) { $subQuery->orWhere('bank_name', 'like', "%{$search}%") ->orWhere('account_name', 'like', "%{$search}%") ->orWhere('account_number', 'like', "%{$search}%"); }); })->toSql();
这段代码生成的SQL完全符合你的目标:
select * from bank where shop_id = '1' and (bank_name like '%Bank%' or account_name like '%Bank%' or account_number like '%Bank%')
原理:嵌套的where闭包会让Eloquent将内部所有条件作为一个整体包裹在括号中,强制SQL先计算括号内的or逻辑,再和外部的shop_id = 1做and判断,既满足需求,又不会带来额外性能开销。
内容的提问来源于stack exchange,提问作者bambang supono
相关产品推荐
相关产品推荐

