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

Laravel Eloquent查询:排除三级关联为空的主模型

解决三级关联模型的筛选问题

要实现仅返回存在符合条件3rdModel的MainModel,你需要在查询中同时用whereHas过滤MainModel本身,而非仅在with中过滤预加载的关联数据。现有代码的问题是:with只会筛选预加载的2ndModel,但不会排除那些没有符合条件关联的MainModel。

修正后的查询代码

return $query->first_model_queries
    // 过滤MainModel:仅保留存在符合条件2ndModel的记录
    ->whereHas('has_many_2nd_model', function ($query) use ($array_of_ids) {
        return $query->whereHas('has_many_3rd_model', function ($query) use ($array_of_ids) {
            return $query->whereIn('2ndModel_id', $array_of_ids);
        }, '=', count($array_of_ids));
    })
    // 预加载符合条件的关联数据
    ->with('has_many_2nd_model', function ($query) use ($array_of_ids) {
        return $query->whereHas('has_many_3rd_model', function ($query) use ($array_of_ids) {
            return $query->whereIn('2ndModel_id', $array_of_ids);
        }, '=', count($array_of_ids));
    });

代码说明

  • whereHas('has_many_2nd_model', ...):直接筛选MainModel,只保留存在至少一个满足后续3rdModel条件的2ndModel的记录,以此排除id为1和3的MainModel。
  • 保留原有的with回调:确保预加载的2ndModel和3rdModel都是符合条件的数据,避免返回无关的关联记录。

模型关系无需调整

你当前定义的has_many_2nd_model和has_many_3rd_model关联关系是正确的,不需要修改。

内容的提问来源于stack exchange,提问作者Mr. Kenneth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:42:13