使用 Laravel 9 Eloquent 查询每日用户新增记录,需用 selectRaw('DATE(created_at) as date, COUNT(*) as count') 按天分组统计;PostgreSQL 需改用 created_at::date;查指定日用 whereDate;补零需应用层生成日期数组合并;created_at 字段须加索引。

要使用 Laravel 9 的 Eloquent 查询「每日用户新增记录」,核心是按 created_at 字段按天分组,并统计每天的用户数。Laravel 提供了简洁的链式方法配合数据库原生函数(如 DATE() 或 CAST())来实现。
使用 selectRaw + groupBy 按天聚合
这是最常用且兼容 MySQL、PostgreSQL(需微调)的方式:
$dailyNewUsers = User::selectRaw('DATE(created_at) as date, COUNT(*) as count')
->groupBy('date')
->orderBy('date', 'desc')
->get();
返回结果示例:
[
{"date": "2024-05-20", "count": 12},
{"date": "2024-05-19", "count": 8},
...
]
✅ 适合 MySQL;PostgreSQL 需将 DATE(created_at) 改为 created_at::date。
使用 whereDate 查询某一天的具体新增用户
若需查指定日期(如今天)的所有新用户模型实例:
User::whereDate('created_at', today())->get()User::whereDate('created_at', '2024-05-20')->get()
注意:whereDate 不分组,返回的是完整模型集合,适合导出或详情展示。
扩展:包含无数据日期(补零)
如果希望图表显示连续 7 天(含 0 新增的日期),Eloquent 本身不直接支持“左连接日历表”,推荐在应用层补全:
- 先查出有数据的日期范围内的统计结果(如上面的
$dailyNewUsers) - 用 PHP 生成最近 7 天日期数组:
collect(range(0, 6))->map(fn($i) => today()->subDays($i)->toDateString()) - 合并并填充缺失日期的 count 为 0
这样既保持查询轻量,又满足前端图表需求。
性能与索引建议
高频查询该数据时,务必确保 created_at 字段有索引:
php artisan make:migration add_index_to_users_created_at
// 在 migration 中:
Schema::table('users', function (Blueprint $table) {
$table->index('created_at');
});
复合索引(如 (created_at, id))在只查数量时可能进一步提升性能,尤其当表很大时。


















