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

Laravel使用WhereHas查询时无关联关系的记录被过滤问题

问题根因

你写的判断逻辑if ($query->has('order'))完全不符合Laravel查询构造器的执行逻辑:

  • 这个判断是在SQL构造阶段执行的,不是逐行匹配数据时执行的,$query->has('order')返回的是查询构造器对象而非布尔值,所以if判断永远为真,永远只会走加whereHas过滤的分支
  • whereHas('order')本身的语义就是「仅返回存在关联order记录的模型」,自然就把所有没有order关联的persons全部过滤掉了

正确写法

你需要的逻辑是「没有order关联 或者 有关联且order状态不是completed」,直接用whereHas和orDoesntHave组合条件即可,不需要写分支判断:

Event::where('id', $id)->with(['persons' => function ($query) {
    $query->select('persons.id', 'name', 'title', 'status', 'title_prefixe', 'title_suffixe')
        ->where(function ($q) {
            // 条件1:存在order关联且status不等于completed
            $q->whereHas('order', function ($subQ) {
                $subQ->where('status', '!=', 'completed');
            })
            // 条件2:不存在order关联
            ->orDoesntHave('order');
        });
}])->first();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:15:03