如何强制迁移创建 datetime2 字段而不是 datetime

Ama*_*san 3 sql-server laravel

我正在开发一个访问 sqlserver 数据库的 laravel 应用程序,我需要我的日期字段为datetime2. 问题是,如果我告诉迁移引擎创建一个如下所示的日期时间字段:

$table->dateTime('myDateTimeColumn');
Run Code Online (Sandbox Code Playgroud)

if 将创建一个datetime字段,而不是一个datetime2字段。

我怎样才能强制datetime2列,而不必在迁移后更改它们(这听起来很草率)?

Sha*_*aar 5

通过向创建日期时间列的方法添加精度 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

当您未指定创建日期时间列的迁移方法的精度时,该测试将失败。