laravel 9 不支持 whereday 方法,需用 whereraw 模拟或封装本地作用域;laravel 10.25+ 原生支持且自动适配多数据库。

Laravel 9 中没有内置的 whereDay 方法。它是在 Laravel 10.25 版本中才新增的查询构造器方法。如果你正在使用 Laravel 9,直接调用 whereDay('created_at', 15) 会报错:`Call to undefined method Illuminate\Database\Query\Builder::whereDay()`。
替代方案:用 whereRaw 模拟 whereDay 行为
在 Laravel 9 中,可通过 whereRaw 结合数据库函数提取日期中的“日”部分来实现相同效果。不同数据库语法略有差异:
-
MySQL / MariaDB:用
DAY()或EXTRACT(DAY FROM ...) -
PostgreSQL:用
EXTRACT(DAY FROM ...) -
SQLite:用
strftime('%d', ...)
示例(MySQL):
$users = User::whereRaw('DAY(created_at) = ?', [15])->get();
// 或更明确地写
$users = User::whereRaw('EXTRACT(DAY FROM created_at) = ?', [15])->get();
封装成本地作用域(推荐复用)
为避免重复写 whereRaw,可在模型中定义一个本地作用域:
// app/Models/User.php
public function scopeWhereDay(Builder $builder, string $column, int $day): Builder
{
return $builder->whereRaw('DAY(' . $builder->raw($column) . ') = ?', [$day]);
}
之后即可像这样调用:
$users = User::whereDay('created_at', 15)->get();
注意时区与日期字段类型
确保 created_at 等字段是 DATETIME 或 TIMESTAMP 类型,且数据库时区与 PHP 应用一致。若时间存为 UTC,而你想按本地时间筛选“15号”,需先转换时区或在应用层处理,不能仅依赖数据库函数。
例如,UTC 时间 2024-04-15 23:00:00 在东八区已是 4月16日,直接 DAY() 会返回 15,但业务上可能期望匹配 16。
升级到 Laravel 10 是一劳永逸的解法
如果项目允许升级,Laravel 10.25+ 原生支持:
$users = User::whereDay('created_at', 15)->get();
$users = User::whereDay('created_at', '>=', 10)->get();
该方法自动适配 MySQL、PostgreSQL、SQLite 和 SQL Server,底层已做方言兼容。











