Laravel8 Eloquent查询groupBy后如何排除关联关系为null的条目
Laravel 8 过滤groupBy后关联关系为null条目的解决方案
方案1:查询阶段直接过滤(性能最优,推荐使用)
在构造SQL查询时通过whereHas()方法直接排除不存在对应关联的记录,后续groupBy的结果天然不会出现关联为null的条目:
// 替换yourModel为你的模型名,relationName为你定义的关联方法名 $result = yourModel::query() ->whereHas('relationName') ->with('relationName') ->groupBy('关联表.分组字段名') ->get();
如果需要直接基于关联表字段做分组,也可以用内连接join()实现,同样会自动过滤无关联的记录:
$result = yourModel::query() ->join('关联表名', '主表.外键字段', '=', '关联表.主键字段') ->select('主表.*', '关联表.所需字段名') ->groupBy('关联表.分组字段名') ->with('relationName') ->get();
方案2:集合层面过滤(适用于已拿到查询结果的场景)
如果已经执行完查询得到了结果集,可以调用Laravel集合的filter()方法手动过滤:
$result = yourModel::query() ->with('relationName') ->groupBy('分组字段名') ->get() ->filter(fn ($item) => !is_null($item->relationName)) ->values(); // 重置过滤后的集合索引,避免出现索引跳号问题
内容的提问来源于stack exchange,提问作者Andrei Duca
相关产品推荐
相关产品推荐

