提问者:小点点

如何使用Laravel迁移将时间戳列的默认值设置为当前时间戳?


我希望使用Laravel模式构建器/迁移在UPDATE CURRENT_TIMESTAMP上创建一个时间戳列,其默认值为CURRENT_TIMESTAMP。我已经浏览了Laravel文档好几次,但我不明白如何将其设置为时间戳列的默认值。

timestamps()函数为它创建的两个列创建默认值0000-00-000000


共1个答案

匿名用户

如果是raw表达式,则应使用db::raw()current_timestamp设置为列的默认值:

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

这在每个数据库驱动程序上都是完美无缺的。

新建快捷方式

从Laravel 5.1.25开始(请参阅PR 10962和commit 15C487FE),您可以使用新的usecurrent()列修饰符方法将current_timestamp设置为列的默认值:

$table->timestamp('created_at')->useCurrent();

回到这个问题,在MySQL上,您还可以通过db::raw()使用on update子句:

$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

>

  • MySQL

    从MySQL 5.7开始,0000-00-00 00:00:00不再被视为有效日期。如Laravel5.2升级指南中所述,当您将记录插入数据库时,所有时间戳列都应该收到一个有效的默认值。您可以在迁移中使用usecurrent()列修饰符(来自Laravel 5.1.25和更高版本)将时间戳列默认为当前时间戳,也可以使时间戳nullable()允许空值。

    PostgreSQL和Laravel 4.x

    在Laravel 4.x版本中,PostgreSQL驱动程序使用默认的数据库精度来存储时间戳值。当对具有默认精度的列使用currenttimestamp函数时,PostgreSQL会生成一个具有更高精度的时间戳,从而生成一个具有小数第二部分的时间戳--参见此SQL小提琴。

    这将导致Carbon无法解析时间戳,因为它不会期望存储微秒。为了避免这种意外行为破坏应用程序,您必须显式地为current_timestamp函数指定一个零精度,如下所示:

    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
    

    自Laravel 5.0以来,timestamp()列已被更改为使用默认精度为零,从而避免了这种情况。

    感谢@andrewhl在评论中指出这个问题。