本文详解如何利用 laravel 的查询构建器和 carbon 库,从 exercises 表的日期字段中提取月份编号(如 1–12),实现按月聚合统计用户训练天数,并找出训练最频繁的月份。
本文详解如何利用 laravel 的查询构建器和 carbon 库,从 exercises 表的日期字段中提取月份编号(如 1–12),实现按月聚合统计用户训练天数,并找出训练最频繁的月份。
在 Laravel 开发中,常需对日期型字段(如 day)进行时间维度聚合分析。你已成功使用 whereMonth() 和 whereYear() 获取当前月的训练天数,但要找出“历史中训练天数最多的月份”,关键在于从存储的日期中动态提取月份信息并分组统计,而非依赖额外表。
Laravel 的查询构建器原生支持 groupByRaw() 配合 MySQL 的 MONTH() 函数,无需手动解析日期字符串。推荐写法如下:
use IlluminateSupportFacadesDB;$topMonth = DB::table('exercises') ->selectRaw('MONTH(day) as month_num, COUNT(DISTINCT DATE(day)) as workout_days') ->where('user_id', auth()->id()) ->groupByRaw('MONTH(day)') ->orderByDesc('workout_days') ->limit(1) ->first();if ($topMonth) { echo "训练最多的月份是:{$topMonth->month_num}月(共{$topMonth->workout_days}天)";}
✅ 说明与优势:
⚠️ 注意事项:
总结:提取月份的核心在于善用数据库原生函数完成聚合,而非在应用层逐条解析。结合 groupByRaw 与 MONTH(),即可简洁、高效地实现“月度训练热度分析”,并轻松扩展为年度对比、趋势图表等高级功能。