laravel 10 无内置 wheredaterange 方法,推荐用 wherebetween 配合 carbon 的 startofday/endofday 实现日期范围查询,确保 datetime 字段精度;也可在模型中定义本地作用域封装该逻辑。

Laravel 10 本身没有内置的 whereDateRange 方法,但你可以用原生的 whereBetween 配合 Carbon 或日期字符串轻松实现“查询某日期范围内(多日)的数据”。
用 whereBetween 查询日期范围(推荐)
这是最常用、最直接的方式。Laravel 的 whereBetween 支持对日期字段做闭区间查询,只要确保数据库字段是 DATE、DATETIME 或 TIMESTAMP 类型即可。
示例:查 2024-05-01 到 2024-05-05(含)之间的订单
$orders = Order::whereBetween('created_at', [
'2024-05-01',
'2024-05-05 23:59:59'
])->get();
⚠️ 注意:如果字段是 datetime 类型,建议把结束时间设为当天最后一秒(如 '2024-05-05 23:59:59'),否则只写 '2024-05-05' 可能漏掉当天下午的数据。
用 Carbon 精确控制起止时间
更健壮的做法是用 Carbon 生成标准时间对象,避免手动拼字符串出错:
- 查完整日期范围(从当天 00:00:00 到当天 23:59:59)
use Carbon\Carbon;
$startDate = Carbon::parse('2024-05-01')->startOfDay(); // 2024-05-01 00:00:00
$endDate = Carbon::parse('2024-05-05')->endOfDay(); // 2024-05-05 23:59:59
$orders = Order::whereBetween('created_at', [$startDate, $endDate])->get();
- 动态查最近 7 天(含今天)
$sevenDaysAgo = now()->subDays(6)->startOfDay(); // 从 6 天前开始,覆盖共 7 天
$todayEnd = now()->endOfDay();
$orders = Order::whereBetween('created_at', [$sevenDaysAgo, $todayEnd])->get();
自定义 whereDateRange 作用域(可选)
如果你频繁使用这个逻辑,可以在模型中加一个本地作用域:
// 在 app/Models/Order.php 中
public function scopeWhereDateRange(Builder $builder, string $column, string $startDate, string $endDate): Builder
{
return $builder->whereBetween($column, [
Carbon::parse($startDate)->startOfDay(),
Carbon::parse($endDate)->endOfDay()
]);
}
然后这样调用:
$orders = Order::whereDateRange('created_at', '2024-05-01', '2024-05-05')->get();
只按日期(忽略时间)查?用 whereDate
如果字段是 datetime 类型,但你只想按「日期部分」匹配(比如所有 5 月 1 日的记录,不管几点),可用 Laravel 内置的 whereDate 配合循环或 whereIn,但更高效的是用 whereBetween + startOfDay/endOfDay(上面已覆盖)。
不推荐对多天逐个 whereDate 再 orWhere,易出错且性能差。
不复杂但容易忽略的是时间精度和字段类型匹配——确认你的数据库列类型,再决定用 whereDate 还是 whereBetween,多数场景后者更稳妥。











