如何在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
相关产品推荐
相关产品推荐

