Laravel中如何使用groupBy集合方法对模型查询结果进行分组?
- 内容介绍
- 文章标签
- 相关推荐
本文共计990个文字,预计阅读时间需要4分钟。
很多人一上来就写《DB: @table('users')》。
关键区别:groupBy 在集合上才有“分组为嵌套结构”的语义;在查询构建器里它只是告诉数据库加 GROUP BY 子句,常配合 COUNT、SUM 用,不保留原始模型全量数据。
- 查完再分组:先
get()得到Illuminate\Support\Collection,再调groupBy('status') - 如果数据量大(比如上万条),别在 PHP 层分组,优先考虑数据库聚合或分页后处理
-
groupBy的参数可以是字符串(字段名)、闭包(自定义分组逻辑)、甚至数组(多级分组)
用groupBy时字段不存在会静默失败
比如模型里没加 status 到 $appends 或没定义访问器,但你写了 $users->groupBy('status'),结果是空数组或按 null 归为一组——不会报错,也不提示。
常见场景:你想按关联模型字段分组,比如 user->posts->groupBy('category_id'),但 Post 模型没加载 category_id(用了延迟加载或没 select),这时分组键就是 null。
本文共计990个文字,预计阅读时间需要4分钟。
很多人一上来就写《DB: @table('users')》。
关键区别:groupBy 在集合上才有“分组为嵌套结构”的语义;在查询构建器里它只是告诉数据库加 GROUP BY 子句,常配合 COUNT、SUM 用,不保留原始模型全量数据。
- 查完再分组:先
get()得到Illuminate\Support\Collection,再调groupBy('status') - 如果数据量大(比如上万条),别在 PHP 层分组,优先考虑数据库聚合或分页后处理
-
groupBy的参数可以是字符串(字段名)、闭包(自定义分组逻辑)、甚至数组(多级分组)
用groupBy时字段不存在会静默失败
比如模型里没加 status 到 $appends 或没定义访问器,但你写了 $users->groupBy('status'),结果是空数组或按 null 归为一组——不会报错,也不提示。
常见场景:你想按关联模型字段分组,比如 user->posts->groupBy('category_id'),但 Post 模型没加载 category_id(用了延迟加载或没 select),这时分组键就是 null。

