You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:31:25