在 Laravel 11 中,查询当天记录推荐使用 ->whereDate('created_at', today()),它自动提取字段日期部分并与当前时区日期比对;需确保数据库与应用时区一致,否则应统一为 UTC 或调整时间处理方式。

在 Laravel 11 中,使用 whereDate() 查询当天记录非常直接,关键是传入正确的日期字段和目标日期(通常是 now() 或 today)。
使用 whereDate() 查询当天数据
whereDate() 会自动提取数据库字段的日期部分(忽略时分秒),并与你提供的日期字符串(如 'Y-m-d' 格式)比对。查询「当天」最常用的方式是传入 Carbon::today() 或 now()->toDateString():
-
推荐写法(简洁安全):
->whereDate('created_at', today()) -
等效写法(显式 Carbon):
->whereDate('created_at', \Carbon\Carbon::today()) -
手动字符串(不推荐,易出错):
->whereDate('created_at', now()->format('Y-m-d'))
完整示例(Eloquent 查询)
假设你想查 orders 表中今天创建的订单:
$todayOrders = Order::whereDate('created_at', today())
->get();
如果字段是 updated_at 或其他时间字段,只需替换字段名即可,例如:whereDate('updated_at', today())。
注意时区与数据库配置
Laravel 默认使用应用时区(config/app.php 中的 'timezone'),而 today() 返回的是 PHP 当前时区的日期。确保你的数据库服务器时区与 Laravel 应用时区一致,否则可能查不到数据。若数据库用 UTC,而应用设为 'Asia/Shanghai',建议统一用 UTC 时间处理,或使用:
->whereDate('created_at', now('UTC')->toDateString())- 或在模型中设置
$casts = ['created_at' => 'datetime:Y-m-d']辅助调试(非必需)
替代方案:用 whereBetween 更精确(可选)
如果你需要严格按「00:00:00 到 23:59:59」范围查询(尤其跨时区或有毫秒精度需求),可用:
$start = today()->startOfDay();
$end = today()->endOfDay();
$orders = Order::whereBetween('created_at', [$start, $end])->get();
这种方式更可控,但多数场景下 whereDate() 已足够且性能更好(能利用日期索引)。


















