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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:45:01