我正在开发一个访问sqlserver数据库的laravel应用程序,我需要我的日期字段为datetime2
。问题是,如果我告诉迁移引擎创建一个这样的日期时间字段:
$table->dateTime('myDateTimeColumn');
如果将创建一个datetime
字段,而不是datetime2
字段。
如何强制一个datetime2
列而不必在迁移后更改它们(这听起来非常草率)?
在Illuminate/Database/Schema/Grammars/SqlServerGrammar.php
更改函数typeDateTime()
所以它返回'datetime2'
而不是datetime。
而对于typeTimestamp()
你可以做同样的事情!
通过向创建datetime列的方法添加精度int来强制datetime2。
$table->datetime(4);
$table->timestamp(4);
$table->timestamps(4);
使用datetime(),timestamp()或timestamps()而不指定整数将在SQL Server上生成DATETIME
列类型,现在使用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
如果未在创建datetime列的迁移方法上指定精度,则该测试将失败。
你可以做同样的$table->addColumn('type','name')
$table->addColumn('datetime','myDateTimeColumn');
我希望这有帮助。