当前位置: 首页 > 知识库问答 >
问题:

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

顾淳
2023-03-14

我希望使用Laravel模式构建器/迁移在UPDATE CURRENT_TIMESTAMP上创建一个时间戳列,其默认值为CURRENT_TIMESTAMP。我已经浏览了Laravel文档好几次,但我不明白如何将其设置为时间戳列的默认值。

timestamps()函数为它创建的两个列创建默认值0000-00-000000


共有1个答案

裴甫
2023-03-14

如果是raw表达式,则应使用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开始,0000-00-00 00:00:00不再被视为有效日期。如Laravel5.2升级指南中所述,当您将记录插入数据库时,所有时间戳列都应该收到一个有效的默认值。您可以在迁移中使用usecurrent()列修饰符(来自Laravel 5.1.25和更高版本)将时间戳列默认为当前时间戳,也可以使时间戳nullable()允许空值。

    PostgreSQL和Laravel 4.x在Laravel 4.x版本中,PostgreSQL驱动程序使用默认的数据库精度来存储时间戳值。当对具有默认精度的列使用currenttimestamp函数时,PostgreSQL会生成一个具有更高精度的时间戳,从而生成一个具有小数第二部分的时间戳--参见此SQL小提琴。

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

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

    自Laravel 5.0以来,timestamp()列已被更改为使用默认精度为零,从而避免了这种情况。

    感谢@andrewhl在评论中指出这个问题。

  •  类似资料:
    • 我试图实现以下所示的功能: 这个代码失败了,因为 类DateTime的对象无法转换为字符串 另一个问题是,我觉得应该有更稳健/优雅的方法来解决这个问题。那么,如何在迁移中正确设置默认的值呢?

    • 我的mysql版本是5.5.41-0Ubuntu0.14.04.1(Ubuntu)

    • 我有一个主要基于CET地区的项目。我在配置/app.php中设置了CET,但是基中的所有枢轴时间戳都存储在UTC时间? 如何设置时间戳的“全局”时区? 我做了这个测试: 结果是这样的: TNX Y

    • 我有一张有数千行的桌子。由于表最初不是在列处使用created_构造的,因此无法获取它们的创建时间戳。不过,开始获取未来行的时间戳是至关重要的。 有没有一种方法可以添加一个带有默认值NOW()的timestamp列,这样它就不会将值填充到以前的行中,而只填充到将来的行中? 如果我执行查询,它将用时间戳填充所有行:

    • 错误1067(42000):“updated”的默认值无效 我想这是因为的精度只有秒。 如何将当前时间设置为具有小数部分的的默认值?

    • 问题内容: 我需要在CURRENT_DATE()列上使用默认值创建mysql表 我尝试 但它写一个错误 问题是什么? 我只需要唯一日期而不需要全职信息… 你能帮助我吗? 问题答案: 使用 CURRENT_TIMESTAMP 函数而不是 CURRENT_DATE() 函数 试试这个: