我正在开发一个访问 sqlserver 数据库的 laravel 应用程序,我需要我的日期字段是 datetime2
。问题是,如果我告诉迁移引擎创建一个这样的日期时间字段:
$table->dateTime('myDateTimeColumn');
if 将创建一个 datetime
字段,而不是 datetime2
字段。
如何在迁移后强制使用 datetime2
列而不更改它们(这听起来很草率)?
最佳答案
通过向创建日期时间列的方法添加一个精度整数来强制使用 datetime2。
$table->datetime(4);
$table->timestamp(4);
$table->timestamps(4);
在不指定整数的情况下使用 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';
}
我也在GitHub上做了一个单元测试用例。 https://gist.github.com/spacemudd/abfa7ef66d096f3f20796bf373df365b
当您没有为创建日期时间列的迁移方法指定精度时,该测试将失败。
关于sql-server - 如何强制迁移创建 datetime2 字段而不是 datetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46769546/