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
相关产品推荐
相关产品推荐

