我正在开发一个访问sqlserver数据库的laravel应用程序,我需要将我的日期字段设为datetime2
。问题是,如果我告诉迁移引擎创建一个这样的日期时间字段:
$table->dateTime('myDateTimeColumn');
如果要创建datetime
字段,而不是datetime2
字段。
如何强制datetime2
列而不必在迁移后更改它们(听起来非常草率)?
答案 0 :(得分:1)
在Illuminate/Database/Schema/Grammars/SqlServerGrammar.php
更改函数typeDateTime()
,使其返回'datetime2'
而不是日期时间。
对于typeTimestamp()
你可以做同样的事情!
答案 1 :(得分:1)
通过向创建datetime列的方法添加精度int来强制执行datetime2。
$table->datetime(4);
$table->timestamp(4);
$table->timestamps(4);
使用datetime(),timestamp()或timestamps()而不指定整数将在SQL Server上生成DATETIME
列类型,现在使用Laravel保存任何日期将破坏代码,因为{{1} }列类型仅允许微秒部分的3位数。 Laravel 有时 放置4位数的微秒,因此需要DATETIME
。
我在阅读Laravel的源文件时发现了解决方案:
DATETIME2
它包含此功能:
Illuminate\Database\Schema\Grammars\SqlServerGrammer.php
我也在GitHub上做了一个单元测试用例。 https://gist.github.com/spacemudd/abfa7ef66d096f3f20796bf373df365b
如果您未指定创建日期时间列的迁移方法的精度,那么该测试将失败。
答案 2 :(得分:0)
您可以执行相同的$table->addColumn('type','name')
$table->addColumn('datetime','myDateTimeColumn');
我希望这会有所帮助。