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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:39:02