在 Laravel 8 中统计每日订单数需用查询构建器按日期分组计数,MySQL 用 DATE(),PostgreSQL/SQLite 语法不同,推荐 whereDate() + groupBy() 保证兼容性,空日期需 PHP 层补全,created_at 字段应建索引提升性能。

在 Laravel 8 中,使用查询构建器(Query Builder)统计每天的订单数量,核心是按日期分组并计数。关键在于正确提取日期字段(如 created_at),同时注意时区和数据库函数兼容性。
使用 DATE() 提取日期并分组
MySQL 用户可直接用 DATE() 函数截取日期部分,配合 groupBy() 和 count() 实现统计:
$dailyOrders = DB::table('orders')
->select(DB::raw('DATE(created_at) as date'), DB::raw('COUNT(*) as count'))
->whereDate('created_at', '>=', now()->subDays(30))
->groupBy('date')
->orderBy('date')
->get();
结果中每条记录包含 date(如 "2024-05-01")和当天订单数 count。
适配 PostgreSQL 或 SQLite:用 date() 或 strftime()
不同数据库语法略有差异:
- PostgreSQL:
date(created_at)或created_at::date - SQLite:
DATE(created_at)或strftime('%Y-%m-%d', created_at)
为保持兼容性,推荐用 Laravel 内置的 whereDate() + groupBy() 组合,底层会自动适配:
$dailyOrders = DB::table('orders')
->selectRaw('DATE(created_at) as date')
->selectRaw('COUNT(*) as count')
->whereBetween('created_at', [now()->startOfMonth(), now()])
->groupByRaw('DATE(created_at)')
->orderBy('date')
->get();
补充:补全无订单日期(如日历展示需要)
查询构建器本身不生成“空日期”,需在 PHP 层补全。例如获取最近 7 天,即使某天无订单也显示 0:
$rawData = DB::table('orders')
->selectRaw('DATE(created_at) as date, COUNT(*) as count')
->whereDate('created_at', '>=', now()->subDays(6))
->groupByRaw('DATE(created_at)')
->get()
->keyBy('date');
<p>$dates = collect(range(0, 6))
->map(fn($i) => now()->subDays(6 - $i)->format('Y-m-d'))
->mapWithKeys(fn($date) => [$date => $rawData->get($date, (object)['count' => 0])->count]);</p><p>// $dates 是键为日期、值为数量的集合
性能与索引建议
高频统计场景下,确保 created_at 字段有索引:
// 迁移中添加
Schema::table('orders', function (Blueprint $table) {
$table->index('created_at');
});
若只查日期范围且数据量大,可考虑添加生成列索引(MySQL 5.7+)或使用日期分区表。


















