Laravel使用When函数实现搜索功能的底层逻辑咨询
Laravel
when 方法查询逻辑说明 你的判断不完全准确:when 方法本身没有预设 OR 或 AND 逻辑,它只是用于条件构造查询的语法糖,你实际使用中感知到的 OR 逻辑,是由你在闭包内编写的查询语句决定的。
底层运行规则
when 方法的核心逻辑非常简洁,仅做条件判断和分支执行:
- 接收三个参数:判断条件、条件为真时执行的闭包、可选的条件为假时执行的闭包
- 仅当第一个判断参数返回
true时,才会将当前查询构造器实例传入闭包,执行你定义的查询逻辑 - 本身不会在查询语句中额外拼接任何
AND/OR操作符
常见场景代码示例
生成 AND 逻辑的写法
如果在多个 when 闭包内独立使用 where 方法,最终查询会默认用 AND 拼接所有条件:
$users = User::query() ->when($request->name, function ($query, $name) { return $query->where('name', 'like', "%{$name}%"); }) ->when($request->mobile, function ($query, $mobile) { return $query->where('mobile', $mobile); }) ->get();
最终生成的 SQL 结构为:
SELECT * FROM users WHERE name LIKE ? AND mobile = ?
生成 OR 逻辑的写法
如果在闭包内使用 orWhere 拼接查询条件,就会生成 OR 逻辑的查询,这也是你实际使用时观察到 OR 效果的原因:
$users = User::query() ->when($request->keyword, function ($query, $keyword) { return $query->where('name', 'like', "%{$keyword}%") ->orWhere('email', 'like', "%{$keyword}%"); }) ->get();
最终生成的 SQL 结构为:
SELECT * FROM users WHERE name LIKE ? OR email LIKE ?
总结
你当前搜索功能走 OR 逻辑完全是业务代码的查询写法导致的,和 when 方法本身无关。如果需要调整为 AND 逻辑,只需修改闭包内的条件拼接方式即可。
内容的提问来源于stack exchange,提问作者Muhammad Sabir
相关产品推荐
相关产品推荐

