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

我想使用Laravel架构生成器/迁移创建一个时间戳列,其认值为CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP.我已多次浏览Laravel文档,但我看不出如何将其作为timestamp列的认值.

timestamps()函数使得它所生成的两列都使用认的00:00.

解决方法:

鉴于它是一个原始表达式,您应该使用DB :: raw()将CURRENT_TIMESTAMP设置为列的认值:

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

这在每个数据库驱动程序上都可以正常运行.

新的捷径

从Laravel 5.1.25开始(参见PR 10962commit 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开始,00:00:00不再被视为有效日期.如Laravel 5.2 upgrade guide所述,当您将记录插入数据库时​​,所有时间戳列都应该收到有效的认值.您可以在迁移中使用useCurrent()列修饰符(来自Laravel 5.1.25及更高版本)将timestamp列认为当前时间戳,或者可以使时间戳nullable()允许空值.
> Postgresql& Laravel 4.x
在Laravel 4.x版本中,Postgresql驱动程序使用数据库精度来存储时间戳值.在具有认精度的列上使用CURRENT_TIMESTAMP函数时,Postgresql生成具有更高精度的时间戳,从而生成带有小数第二部分的时间戳 – see this SQL fiddle.

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

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

从Laravel 5.0开始,timestamp()列已更改为使用认精度零,这样可以避免这种情况.

感谢@andrewhl评论中指出了这个问题.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...