Laravel Eloquent如何正确联用doesntHave与orWhereHas实现OR查询
问题原因
直接链式调用doesntHave()后接orWhereHas()时,两个关联条件不会被自动分到同一个逻辑分组中。受SQL语法AND优先级高于OR的规则影响,最终生成的SQL语句会出现逻辑错位:
实际执行逻辑会变成「(其他默认查询约束 AND 无关联图片) OR 存在已确认的关联图片」,OR后面的条件会脱离原有查询的约束范围,导致返回结果不符合预期。
正确实现
需要把两个OR关联的判断条件包裹在同一个闭包查询组内,保证两个条件作为整体和其他查询约束做AND运算:
$desired_users = User::where(function ($query) { $query->doesntHave('images') ->orWhereHas('images', function ($imageQuery) { $imageQuery->where('is_confirmed', 1); }); })->get();
该写法生成的SQL逻辑为「其他默认查询约束 AND (无关联图片 OR 存在已确认的关联图片)」,完全匹配需求:
- 无任何关联图片的用户会被返回
- 有关联图片、且至少存在一张已确认(
is_confirmed=1)图片的用户会被返回 - 有图片但所有图片均未确认的用户会被排除
如果关联模型存在软删除等全局作用域,该写法也会自动继承作用域约束,不会出现逻辑异常。
内容的提问来源于stack exchange,提问作者Mahsa
相关产品推荐
相关产品推荐

