Laravel中如何按日期分组并统计对应数据的数量?
如何按日期分组并统计匹配记录总数?
嘿,我来帮你搞定这个统计需求!你现在的代码会把相同日期的记录覆盖掉——因为直接给$array[$match->date_access]赋值,最后每个日期只会保留最后一条的status,自然没法统计总数。下面给你两种高效的实现方式:
方法一:数据库层面分组统计(推荐)
直接让数据库完成分组和统计,性能更好,尤其是数据量较大的时候:
$matchCounts = DiraChatLog::where('status', '=', 'Match') ->whereBetween('date_access', [$request->from, $request->to]) ->selectRaw('DATE(date_access) as date, COUNT(*) as total') ->groupBy('date') ->get();
小说明:
DATE(date_access)用来把日期时间字段提取出纯日期部分(如果你的date_access本身就是日期类型,直接用date_access即可);COUNT(*)负责统计每个日期下的记录总数;groupBy('date')按日期完成分组;- 最终得到的集合里,每个元素都包含
date(日期)和total(对应总数)字段,直接调用就行。
如果你的数据库是PostgreSQL,把DATE(date_access)换成DATE_TRUNC('day', date_access)就可以适配。
方法二:Laravel集合层面处理
如果已经拿到了$matchs集合,也可以用Laravel的集合方法来处理:
$matchs = DiraChatLog::where('status','=','Match') ->whereBetween('date_access', [$request->from, $request->to]) ->get(); $dateCounts = $matchs->groupBy(function ($item) { // 提取日期部分,根据字段类型调整格式 return $item->date_access->format('Y-m-d'); })->map(function ($group) { return $group->count(); }); dd($dateCounts);
小说明:
groupBy()接收一个闭包,把每条记录按日期完成分组;map()遍历每个分组,返回分组内的记录总数;- 最终得到的是一个键为日期、值为对应总数的集合,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Rajveer Singh
相关产品推荐
相关产品推荐

