我在这个问题上找到了这个答案,但它对我不起作用.
所以,我在数据库中创建了一个条目:
// Write lead to database $lead = Lead::create($lead_data);
时间戳看起来像这样,这很好:
| 2016-01-08 10:34:15 | 2016-01-08 10:34:15 |
但后来我向外部服务器发出请求,我需要更新行:
$lead->user_id = $response['user_id']; $lead->broker_id = $response['broker_id']; $lead->save();
并且created_at字段已更改:
| 2016-01-08 04:34:17 | 2016-01-08 10:34:17 |
我该如何解决这个问题?
编辑
我需要一个只修改行为而不删除列或重置迁移的解决方案.必须在实时数据库上执行此修复,而不触及数据.如下所示,我尝试了以下迁移:
$table->datetime('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->change();
但没有任何反应.created_at字段在更新时仍会被修改.
如果您使用的是Laravel 5.2并使用MySQL,那么时间戳会引入一些"错误".你可以在这里阅读关于github的所有问题.它与时间戳默认值有关,并且MySQL在某些条件下自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性.
基本上,您有三种选择.
更新MySQL变量:
如果将explicit_defaults_for_timestamp
变量设置为TRUE
,则不会自动为时间戳列分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性.您可以在此处阅读有关变量的更多信息.
使用可空时间戳:
更改$table->timestamps()
到$table->nullableTimestamps()
.默认情况下,该$table->timestamps()
命令会创建不可为空的时间戳字段.通过使用$table->nullableTimestamps()
,您的时间戳字段将是可空的,并且MySQL不会自动为第一个分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性.
自己定义时间戳:
而不是使用$table->timestamps
,使用$table->timestamp('updated_at'); $table->timestamp('created_at');
自己.确保'updated_at'字段是表中的第一个时间戳,以便它自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性.