Ama*_*san 3 sql-server laravel
我正在开发一个访问 sqlserver 数据库的 laravel 应用程序,我需要我的日期字段为datetime2. 问题是,如果我告诉迁移引擎创建一个如下所示的日期时间字段:
$table->dateTime('myDateTimeColumn');
Run Code Online (Sandbox Code Playgroud)
if 将创建一个datetime字段,而不是一个datetime2字段。
我怎样才能强制datetime2列,而不必在迁移后更改它们(这听起来很草率)?
通过向创建日期时间列的方法添加精度 int 来强制使用 datetime2。
$table->datetime(4);
$table->timestamp(4);
$table->timestamps(4);
Run Code Online (Sandbox Code Playgroud)
使用 datetime()、timestamp() 或 timestamps() 而不指定整数将DATETIME在 SQL Server 上创建列类型,现在使用 Laravel 保存任何日期都会破坏代码,因为列类型DATETIME只允许微秒部分使用 3 位数字。Laravel有时会为微秒放置 4 位数字,因此需要DATETIME2.
我在阅读 Laravel 的源文件时发现了解决方案:
Illuminate\Database\Schema\Grammars\SqlServerGrammer.php
它包含这个功能:
/**
* Create the column definition for a date-time type.
*
* @param \Illuminate\Support\Fluent $column
* @return string
*/
protected function typeDateTime(Fluent $column)
{
return $column->precision ? "datetime2($column->precision)" : 'datetime';
}
Run Code Online (Sandbox Code Playgroud)
我也在 GitHub 上做了一个单元测试用例。https://gist.github.com/spacemudd/abfa7ef66d096f3f20796bf373df365b
当您未指定创建日期时间列的迁移方法的精度时,该测试将失败。
| 归档时间: |
|
| 查看次数: |
2021 次 |
| 最近记录: |