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

