Laravel Passport安装日期格式报错及全局日期格式修改需求
解决Laravel Passport安装时SQL Server日期格式转换错误
我之前也遇到过Laravel搭配SQL Server安装Passport时的这个日期格式问题,折腾了好一会儿才找到全局解决的办法,不用逐个修改模型,分享给你:
问题根源
SQL Server默认的日期存储格式是Ydm H:i:s(比如20240520 14:30:00),但Laravel的Carbon组件默认输出的日期格式是Y-d-m H:i:s(比如2024-05-20 14:30:00),这就导致执行php artisan passport:install时,插入oauth相关表的日期字段会触发「nvarchar转datetime超出范围」的错误。
全局解决方案(二选一即可)
方法1:通过AppServiceProvider全局配置Carbon和模型日期格式
这是最直接的全局修改方式,一次配置所有模型和Carbon实例:
- 打开项目根目录下的
app/Providers/AppServiceProvider.php文件 - 在
boot()方法中添加以下代码:
use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; public function boot() { // 让Carbon序列化时使用SQL Server兼容的日期格式 Carbon::serializeUsing(function ($carbon) { return $carbon->format('Ymd H:i:s'); }); // 全局设置所有Eloquent模型的默认日期格式 Model::setDateFormat('Ymd H:i:s'); }
方法2:配置SQL Server数据库连接的日期格式
也可以直接在数据库配置中指定SQL Server的日期格式,让Laravel驱动自动适配:
- 打开
config/database.php文件,找到connections数组下的sqlsrv配置项 - 添加
date_format参数:
'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, // 指定SQL Server兼容的日期格式 'date_format' => 'Ymd H:i:s', ],
验证修复效果
配置完成后,先清理Laravel的配置缓存,避免旧配置干扰:
php artisan config:clear php artisan cache:clear
然后重新执行Passport安装命令:
php artisan passport:install
这样就能顺利完成安装,不会再出现日期格式转换的错误了。另外,如果你之前手动给个别模型设置过$dateFormat属性,全局配置会自动覆盖这些单独设置,不需要再保留那些代码。
内容的提问来源于stack exchange,提问作者Abel Olguin Chavez
相关产品推荐
相关产品推荐

