Laravel中如何遍历集合并按user_id聚合统计ID数量
问题描述
现有如下Laravel集合结构:
#items: array:4 [▼ 0 => Collection {#465 ▼ #items: array:2 [▼ "id" => 1 "user_id" => 5 ] } 1 => Collection {#455 ▼ #items: array:2 [▼ "id" => 2 "user_id" => 5 ] } 2 => Collection {#419 ▼ #items: array:2 [▼ "id" => 3 "user_id" => 1 ] } 3 => Collection {#410 ▼ #items: array:2 [▼ "id" => 4 "user_id" => 1 ] } ]
需要将其聚合为按user_id统计对应ID数量的集合,目标结构如下:
#items: array:2 [▼ 0 => Collection {#465 ▼ #items: array:2 [▼ "user_id" => 1 "count" => 2 ] } 1 => Collection {#455 ▼ #items: array:2 [▼ "user_id" => 5 "count" => 2 ] } ]
实现方案
利用Laravel集合的链式方法即可完成聚合,示例代码如下:
$result = $originalCollection // 按user_id字段分组 ->groupBy(fn ($item) => $item->get('user_id')) // 生成统计结构,每个分组转为包含user_id和count的子集合 ->map(fn ($group, $userId) => collect([ 'user_id' => $userId, 'count' => $group->count() ])) // 转为索引数组形式的集合,匹配目标结构的外层格式 ->values();
代码说明
groupBy:根据每个子集合的user_id值进行分组,得到以user_id为键、对应子集合集合为值的关联集合map:遍历每个分组,统计该组元素数量,生成包含user_id和count的新子集合values:将关联集合转为索引集合,对应目标结构的外层数组形式
内容的提问来源于stack exchange,提问作者astroboy
相关产品推荐
相关产品推荐

