微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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评论中指出了这个问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐