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

Laravel Collection如何按datetime列的小时值对数据行进行分组

按小时分组Laravel Collection的实现方案

完全可以实现按datetime字段的小时值分组,以下是两种常用的实现方案:

方案1:在Collection层面处理(适合小数据量场景)

该方案直接对已经拉取到的集合做处理,写法简单灵活,你可以根据需求选择两种分组逻辑:

  • 用Carbon解析时间获取小时值,兼容性更强,适合时间格式不固定的场景:
$grouped = $collection->groupBy(function ($item) {
    return \Carbon\Carbon::parse($item['created_at'])->hour;
});
  • 直接截取时间字符串获取小时值,性能更高,适合你的固定Y-m-d H:i:s时间格式场景:
$grouped = $collection->groupBy(function ($item) {
    // 截取字符串第11位开始的2个字符,即为小时值
    return substr($item['created_at'], 11, 2);
});

处理完成后得到的$grouped就是以10、11这类小时值为key的新集合,每个key对应同小时的所有数据行。

方案2:在MongoDB查询阶段分组(适合大数据量场景)

如果你的数据集很大,拉取全量数据到PHP再分组会占用过多内存,推荐直接在MongoDB侧完成分组计算:

$grouped = DB::connection('test')
    ->collection('test')
    ->raw(function ($collection) {
        return $collection->aggregate([
            [
                '$group' => [
                    // 提取created_at的小时值作为分组key
                    '_id' => ['$hour' => ['$toDate' => '$created_at']],
                    // 存储同组的所有原始文档,可按需调整返回字段
                    'data' => ['$push' => '$$ROOT']
                ]
            ],
            // 可选配置:按小时正序排列结果
            ['$sort' => ['_id' => 1]]
        ]);
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:18:02