Laravel在更新

时间:2016-01-08 09:39:14

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

我在这个主题上找到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字段在更新时仍会被修改。

4 个答案:

答案 0 :(得分:24)

如果您使用的是Laravel 5.2并使用MySQL,那么就会出现一些错误"引入了时间戳。您可以在github here上阅读有关该问题的所有信息。它与时间戳默认值有关,并且MySQL在某些条件下自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。

基本上,您有三种选择。

  1. 更新MySQL变量:
  2. 如果将explicit_defaults_for_timestamp变量设置为TRUE,则不会自动为时间戳列分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。您可以阅读有关变量here的更多信息。

    1. 使用可空的时间戳:
    2. $table->timestamps()更改为$table->nullableTimestamps()。默认情况下,$table->timestamps()命令会创建不可为空的时间戳字段。通过使用$table->nullableTimestamps(),您的时间戳字段将可为空,并且MySQL不会自动为第一个分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。

      1. 自己定义时间戳:
      2. 不要使用$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')来解决这个问题。

(sry,不能只在上面添加评论 - 我的声誉还不够高......)

答案 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;