我在这个主题上找到this answer,但它对我不起作用。
所以,我在数据库中输入一个条目:
// 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字段在更新时仍会被修改。
答案 0 :(得分:24)
如果您使用的是Laravel 5.2并使用MySQL,那么就会出现一些错误"引入了时间戳。您可以在github here上阅读有关该问题的所有信息。它与时间戳默认值有关,并且MySQL在某些条件下自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。
基本上,您有三种选择。
如果将explicit_defaults_for_timestamp
变量设置为TRUE
,则不会自动为时间戳列分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。您可以阅读有关变量here的更多信息。
将$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');
。确保您的“update_at”#39; field是表中的第一个时间戳,因此它将自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。
答案 1 :(得分:3)
Skatch - 我认为你上面的解决方案并不完全正确,但在这种情况下可能很好。
问题是您获得的是PHP日期,而不是默认的默认MYSQL时间戳。当您运行该迁移时,最终会得到如下语句:
alter table alter column created_at default '2016:02:01 12:00:00';
注意您日期的字符串。当您运行迁移时,该日期将始终用于您的created_at,而不是几天后添加记录的当前日期。
而不是做“date('Y:m:d H:i:s')”,你可以做DB :: raw('current_timestamp')来解决这个问题。
答案 2 :(得分:1)
将此作为顶级答案发布,总结我们的评论讨论。
首先,在Laravel中引入了一个日期bug - 如@patricus所述。错误讨论中建议的解决方案是使用nullableTimestamps()而不仅仅是timestamps(),或者直接创建created_at和updated_at字段 - $table->timestamp('updated_at')->change()
。
这也可以使用原始SQL修复。与此
类似的ALTER语句alter table loader_rawvalues MODIFY column updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
这可以直接应用于您现有的数据库表(首先测试它,或者当然!)。或者您可以使用DB :: unrepared()从迁移中应用它 - 例如:
class CreateMyTable extends Migration
{
public function up()
{
Schema::create('mytable', function (Blueprint $table) {
$table->bigIncrements('id');
// ...
$table->timestamps();
});
DB::unprepared('alter table mytable MODIFY column updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
}
}
答案 3 :(得分:0)
这肯定是您的表字段定义上的问题。我最近遇到了同样的问题,当我检查表时,created_at
的值是EXTRA
的“ on update CURRENT_TIMESTAMP
”,要让Laravel正常工作,只需使用以下内容更新字段定义: :
ALTER TABLE table_name CHANGE created_at created_at timestamp NOT NULL default CURRENT_TIMESTAMP;