【问题标题】:Laravel Eloquent created_at is getting updatedLaravel Eloquent created_at 正在更新
【发布时间】:2016-04-19 03:00:19
【问题描述】:

我刚刚遇到了 Eloquent (Laravel 5.2.10) 默认时间戳的障碍。默认情况下,$table->timestamps() 方法会在表中为您提供 created_atupdated_at 列,这些列会相应更新。

但是,当我尝试一些测试条目时,我注意到当您更新记录时,updated_at 字段会按原样更新,但 created_at 字段会更新: 它的小时保持在创建时间,但分钟和秒会更新以匹配updated_at 字段。

如果太罗嗦,这里是一个例子:

+---------------------+---------------------+
| created_at          | updated_at          |
+---------------------+---------------------+
| 2016-01-13 17:13:27 | 2016-01-13 22:13:27 |
| 2016-01-13 16:14:41 | 2016-01-13 21:14:41 |
+---------------------+---------------------+

请注意,created_atupdated_at 字段的分钟和秒完全相同。

我试图查看设置了时间戳的Model类,但结果发现在更新记录时确实没有调用setCreatedAt()方法。

为什么会发生这种情况?
如何防止created_at字段发生变化? (更重要)

【问题讨论】:

    标签: php mysql laravel laravel-5 laravel-5.2


    【解决方案1】:

    您的问题可能与这里的问题有关:https://github.com/laravel/framework/issues/11518

    长话短说,很多人的created_at 列都有ON UPDATE CURRENT_TIMESTAMP 属性。

    如 Github 页面所述:

    MySQL 5.7 不再允许 0000-00-00 作为有效时间戳 严格模式打开(默认情况下)。所以要么使用 ->nullableTimestamps()->timestamp()->useCurrent()

    所以,你可以通过改变这个来解决这个问题:

    $table->timestamps();
    

    以下任一选项:

    // Option 1:
    $table->nullableTimestamps();
    
    // Option 2:
    $table->timestamp('updated_at')->useCurrent();
    $table->timestamp('created_at')->useCurrent();
    

    另外,在这个 MySQL 页面上:https://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

    或者,如果explicit_defaults_for_timestamp 被禁用(默认),请执行以下任一操作:

    使用指定常量默认值的 DEFAULT 子句定义列。

    指定 NULL 属性。这也会导致列允许 NULL 值,这意味着您不能通过将列设置为 NULL 来分配当前时间戳。分配 NULL 会将列设置为 NULL。

    【讨论】:

    • 我运行了一个composer update,它把我带到了 5.2.10,但是timestamps() 方法仍然不能正常工作。但是,nullableTimestamps() 确实工作得很好,所以我现在会使用它(你指出我的问题似乎表明这将成为默认的timestamps() 行为,但现在它仍然对我不起作用。无论如何,谢谢!
    • @tam 很抱歉。截至 5 小时前(Laravel 5.2.9+),更改已恢复,因此 useCurrent() 不是默认行为。它给使用旧版本 MySQL 的人带来了一些问题。
    • 没问题。感谢您的替代和解释
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2016-04-12
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多