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

