Laravel中如何统计近1个月内每日交易数量?
解决Laravel中统计当月每日交易数(含无交易日期补0)的问题
原代码的问题
- 按
created_at(精确到时分秒)分组,而非按日期分组,导致仅统计到有交易的精确时间点,而非当日所有交易 count()方法直接返回分组的总数量,而非每日的交易计数- 未生成当月完整的日期序列,无法补全无交易日期的0值
修改后的实现步骤及代码
1. 生成当月所有日期的序列
先获取当月的起始和结束日期,遍历生成所有日期的字符串数组:
use Carbon\Carbon; use Illuminate\Support\Facades\DB; $startDate = Carbon::now()->firstOfMonth(); $endDate = Carbon::now()->endOfMonth(); // 生成当月所有日期的数组,格式为 'Y-m-d' $dates = []; for ($date = $startDate; $date->lte($endDate); $date->addDay()) { $dates[] = $date->toDateString(); }
2. 查询当月每日的交易数量
通过DATE(created_at)将时间字段转换为日期,按日期分组统计交易数:
// 查询每日交易数,结果转为 日期=>计数 的关联数组 $dailyTransactions = Transaction::select( DB::raw('DATE(created_at) as date'), DB::raw('COUNT(*) as count') ) ->whereBetween('created_at', [$startDate, $endDate]) ->groupBy('date') ->pluck('count', 'date') ->toArray();
3. 补全无交易日期的0值
遍历日期序列,匹配查询结果,无交易的日期填充0:
$dailyCounts = []; foreach ($dates as $date) { $dailyCounts[] = $dailyTransactions[$date] ?? 0; } // $dailyCounts 即为期望的结果数组,例如 [1,0,0,...]
关键说明
- 使用
DATE(created_at)可以将同一日期的所有交易合并统计,避免精确时间分组的问题 - 先生成完整日期序列是保证数组包含当月所有日期的核心,确保无交易日期也能显示0
pluck('count', 'date')将查询结果转为以日期为键的数组,方便后续快速匹配
内容的提问来源于stack exchange,提问作者frsnmk
相关产品推荐
相关产品推荐

