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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:27:16