Laravel控制器按日期分组统计并输出指定JSON格式
问题描述
我正在学习JSON,希望实现自定义输出:将同一日期的记录数量累加统计。
数据库表数据
id no_id type created_at ------------------------------------------------ 1 1 post 2023-10-11T17:13:19.000000Z 2 85 post 2023-10-11T17:13:19.000000Z 3 23 post 2023-10-12T17:24:33.000000Z 4 40 post 2023-10-12T17:24:33.000000Z 5 87 product 2023-10-12T17:24:33.000000Z
期望统计结果示例
2023-10-11 => 2 2023-10-12 => 3
当前Laravel控制器代码
class StatController extends Controller { public function index() { $stats = Stat::groupBy(DB::raw('DATE(created_at)'))->get()->toArray(); return array_reverse($stats); } }
当前输出JSON
[ { "id": 2, "no_id": 85, "type": "post", "created_at": "2023-10-11T17:13:19.000000Z" }, { "id": 5, "no_id": 87, "type": "product", "created_at": "2023-10-12T17:24:33.000000Z" } ]
目标输出JSON结构
[ { "date": "2023-10-11", "totalViews": "2" }, { "date": "2023-10-12", "totalViews": "3" } ]
解决方案
修改控制器中的查询逻辑,明确指定统计字段与聚合函数,替换直接获取整条记录的方式,代码如下:
class StatController extends Controller { public function index() { $stats = Stat::select( DB::raw('DATE(created_at) as date'), DB::raw('COUNT(*) as totalViews') ) ->groupBy('date') ->orderBy('date', 'asc') ->get() ->toArray(); return array_reverse($stats); } }
代码说明
- 定义输出字段:通过
select()提取created_at的日期部分并命名为date,用COUNT(*)统计每组记录数并命名为totalViews,完全匹配目标输出的字段结构。 - 分组逻辑:按提取后的
date字段分组,确保同一日期的记录被归为一组统计。 - 排序与倒序:
orderBy('date', 'asc')保证结果按日期正序排列,保留array_reverse()可维持原代码的倒序返回需求,不需要倒序可直接移除该方法。
修改后的输出JSON
[ { "date": "2023-10-12", "totalViews": 3 }, { "date": "2023-10-11", "totalViews": 2 } ]
内容的提问来源于stack exchange,提问作者behroz
相关产品推荐
相关产品推荐

