Laravel Eloquent created_at正在更新


Laravel Eloquent created_at is getting updated

我刚刚遇到了Eloquent(Laravel5.2.10)默认时间戳的障碍。默认情况下,$table->timestamps() 方法在表中为您提供一个created_at和一个updated_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字段更改?(更重要)

您的问题可能与此处的此问题有关: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。