开发者社区> 问答> 正文

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

我想创建一个CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP使用Laravel Schema Builder / Migrations 作为默认值的时间戳列。我已经多次浏览过Laravel文档,但没有看到如何将它设置为timestamp列的默认值。

该timestamps()函数0000-00-00 00:00为其创建的两个列都设置默认值。

展开
收起
保持可爱mmm 2020-05-17 20:55:17 1673 0
1 条回答
写回答
取消 提交回答
  • 鉴于它是原始表达式,您应该使用它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

    2020-05-17 20:59:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像