我想使用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 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开始,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()列已更改为使用默认精度零,这样可以避免这种情况.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。