如何统计Laravel中分组数组数据的总条数?
Laravel分组后统计总条数的实现方法
你当前代码中groupBy操作后、调用toArray()之前拿到的是Laravel集合实例,可以直接用集合内置方法统计总条数,不需要自行遍历计算,以下是两种常用实现方案:
方案1:在集合阶段统计(推荐)
修改你的控制器代码,在分组后直接统计总条数,如果你需要同时返回分组数据和总条数可以这么写:
public function last_10_days_reports() { $day_10 = Carbon::today()->subDays(10)->format('Y-m-d'); $leadsCollection = Lead::whereDate('created_at', '>=', $day_10) ->get() ->sortBy('created_at') ->groupBy(function ($item) { return $item->created_at->format('Y-m-d'); }); // 统计总条数 $totalCount = $leadsCollection->sum(fn($group) => $group->count()); $leads = $leadsCollection->toArray(); // 可以根据需求调整返回结构,比如同时返回总条数和分组数据 return [ 'group_data' => $leads, 'total_count' => $totalCount ]; }
- 原理:
sum方法会遍历每个日期分组,累加每个分组内的条目数得到总条数。
方案2:已转为数组后统计
如果你已经拿到了分组后的数组,也可以用PHP原生方法计算:
$totalCount = array_sum(array_map('count', $leads));
- 原理:先用
array_map获取每个分组的条目数,再用array_sum把所有分组的数量累加得到总和。
性能优化建议
如果你的leads表数据量较大,不建议先全量查询再分组,可以在SQL层面直接做分组统计,减少内存开销:
// 只统计每天的数量,不需要拉取全量数据 $dailyCounts = Lead::whereDate('created_at', '>=', $day_10) ->selectRaw('DATE(created_at) as date, count(*) as count') ->groupBy('date') ->orderBy('date') ->get(); $totalCount = $dailyCounts->sum('count');
内容的提问来源于stack exchange,提问作者Joney Spark
相关产品推荐
相关产品推荐

