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

如何在Eloquent中构造A且(B或C)的查询避免前置筛选条件失效

问题原因

你的原有写法触发了SQL逻辑运算符优先级问题:SQL中AND优先级高于OR,拼接后的查询实际逻辑为 (角色筛选条件 AND 邮箱匹配) OR 用户名匹配,只要用户名匹配搜索词的用户无论是否符合角色条件都会被查出,自然会跳过角色筛选。

正确写法

你需要将两个搜索条件包裹在闭包形式的where中,Eloquent会自动为这部分条件加上括号分组,实现你需要的角色筛选 AND (邮箱匹配 OR 用户名匹配) 逻辑,代码如下:

$users = $user->whereHas('roles', function ($query) use ($role_slugs) {
    return $query->whereIn('slug', $role_slugs);
})->where(function ($query) use ($search_term) {
    // 括号内的两个or条件会作为一个整体和前面的角色条件做AND运算
    $query->where('email', 'like', "%{$search_term}%")
          ->orWhere('name', 'like', "%{$search_term}%");
})->get();

该写法完全在SQL层面完成筛选,不需要后续集合过滤,性能和原生SQL一致。


内容的提问来源于stack exchange,提问作者Tales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:09:04