我想创建一个CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP使用Laravel Schema Builder / Migrations 作为默认值的时间戳列。我已经多次浏览过Laravel文档,但没有看到如何将它设置为timestamp列的默认值。
该timestamps()函数0000-00-00 00:00为其创建的两个列都设置默认值。
鉴于它是原始表达式,您应该使用它DB::raw()来设置CURRENT_TIMESTAMP列的默认值:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); 这在每个数据库驱动程序上都可以完美运行。
新捷径
从Laravel 5.1.25开始(请参阅PR 10962并提交15c487fe),可以使用新的useCurrent()列修饰符方法将设置CURRENT_TIMESTAMP为列的默认值:
$table->timestamp('created_at')->useCurrent(); 回到问题,在MySQL上,您还可以ON UPDATE通过DB::raw()以下方式使用子句:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); 陷阱 MySQL
从MySQL 5.7开始,0000-00-00 00:00:00不再被视为有效日期。如Laravel 5.2升级指南中所述,当您将记录插入数据库时,所有时间戳列均应收到有效的默认值。您可以useCurrent()在迁移中使用column修饰符(来自Laravel 5.1.25及更高版本)将timestamp列默认为当前时间戳,或者可以使timestamps nullable()允许空值。
PostgreSQL&Laravel 4.x
在Laravel 4.x版本中,PostgreSQL驱动程序使用默认的数据库精度来存储时间戳值。在CURRENT_TIMESTAMP具有默认精度的列上使用该函数时,PostgreSQL会生成具有更高可用精度的时间戳,从而生成带有小数第二部分的时间戳- 请参见此SQL提琴。
这将导致Carbon无法解析时间戳,因为它不会期望存储微秒。为了避免这种意外行为破坏您的应用程序,您必须对函数明确给出零精度,CURRENT_TIMESTAMP如下所示:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)')); 从Laravel 5.0开始,将timestamp()列更改为使用默认精度零,从而避免了这种情况。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。