Laravel Eloquent whereHas查询不生效,放入with闭包才正常是什么原因?
问题原因说明
whereHas和with在Eloquent中的作用逻辑完全不同,两种写法的执行效果本身就有本质差异:
- 第一种写法中
whereHas('order_detail', function($query){$query->where('status','lifted');})的作用是:仅过滤主表OrderReturn的查询结果,只会返回「至少关联了1条status=lifted的order_detail」的OrderReturn记录,但不会对关联的order_detail结果做任何过滤,查询出来的OrderReturn会附带所有关联的order_detail,不管status是否符合条件。你认为条件未生效,本质是对whereHas的作用范围理解有误,它不会过滤关联数据,只会过滤主表数据。 - 第二种写法把过滤条件放到
with的闭包里的作用是:不过滤主表OrderReturn的查询结果,仅在预加载关联数据时做过滤,只会把满足status=lifted的order_detail关联到查询结果上,不满足条件的关联数据会返回null。
补充说明
如果你的需求是同时满足「仅返回存在符合条件的order_detail的OrderReturn记录,且关联的order_detail仅保留符合条件的内容」,需要同时写两个条件:
$data['orders'] = OrderReturn::with([ 'order_detail.products', 'order_detail.products.Companies', 'order_detail' => function($query){ $query->where('status','lifted'); } ]) ->whereHas('order_detail',function($query){ $query->where('status','lifted'); }) ->where('customer_id',hashids_decode($id)) ->where('status','lifted') ->get();
内容的提问来源于stack exchange,提问作者Adden07
相关产品推荐
相关产品推荐

