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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:20:37