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

问题描述 投票:1回答:3

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

$table->dateTime('myDateTimeColumn');

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

如何强制一个datetime2列而不必在迁移后更改它们(这听起来非常草率)?

sql-server laravel
3个回答
1
投票

Illuminate/Database/Schema/Grammars/SqlServerGrammar.php

更改函数typeDateTime()所以它返回'datetime2'而不是datetime。

而对于typeTimestamp()你可以做同样的事情!


1
投票

通过向创建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列的迁移方法上指定精度,则该测试将失败。


0
投票

你可以做同样的$table->addColumn('type','name')

$table->addColumn('datetime','myDateTimeColumn');

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.