Laravel Eloquent created_at正在更新

时间:2016-01-13 22:45:54

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

我只是遇到了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字段更改? (更重要的)

1 个答案:

答案 0 :(得分:5)

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