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

Laravel如何实现按日期统计下载量的累计和计算

实现累计下载量统计的两种方案

方案1:数据库窗口函数实现(推荐)

如果使用的是MySQL 8.0及以上、PostgreSQL等支持窗口函数的数据库,可以直接在查询阶段通过SUM() OVER()窗口函数完成累计值计算,无需后续PHP层处理,大数据量下性能更优。
直接修改原查询的select字段,新增累计和计算逻辑即可:

$downloads = Downloads::getTableName();

$model = Downloads::with([])
    ->select([
        DB::raw("date_format($downloads.created_at, '%Y-%m-%d') as date"),
        DB::raw("count($downloads.id) as total_count"),
        DB::raw("SUM(count($downloads.id)) OVER(ORDER BY date_format($downloads.created_at, '%Y-%m-%d')) as cumm_total_count")
    ])
    ->groupBy(DB::raw("date_format($downloads.created_at, '%Y-%m-%d')"))
    ->orderBy('date');

return $model->get();

执行后返回的结果直接携带cumm_total_count字段,和预期结构完全一致。


方案2:Laravel集合层计算(兼容旧版数据库)

如果使用MySQL 5.7等不支持窗口函数的旧版数据库,可以先拿到按日期聚合的统计结果,再通过集合遍历累加计算累计值:

$downloads = Downloads::getTableName();

$statList = Downloads::with([])
    ->select([
        DB::raw("date_format($downloads.created_at, '%Y-%m-%d') as date"),
        DB::raw("count($downloads.id) as total_count")
    ])
    ->groupBy(DB::raw("date_format($downloads.created_at, '%Y-%m-%d')"))
    ->orderBy('date')
    ->get();

$cummulativeTotal = 0;
return $statList->map(function ($item) use (&$cummulativeTotal) {
    $cummulativeTotal += $item->total_count;
    $item->cumm_total_count = $cummulativeTotal;
    return $item;
});

该方案逻辑是初始化累计值变量为0,按日期顺序遍历每一条统计结果时,将当日下载量加到累计值上,再赋值给当前条目的累计下载量字段,最终返回的结果结构和预期完全匹配。


内容的提问来源于stack exchange,提问作者aristotle29

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:48:27