Изменения в Laravel created_at при обновлении

Я нашел этот ответ на эту тему, но это не работает для меня.

Итак, я делаю запись в базе данных:

// 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. Это связано с установками по умолчанию timestamp, и MySQL автоматически назначает атрибуты DEFAULT CURRENT_TIMESTAMP или ON UPDATE CURRENT_TIMESTAMP при определенных условиях.

В принципе, у вас есть три варианта.

  1. Обновить переменную MySQL:

Если вы установите для переменной explicit_defaults_for_timestamp значение TRUE , столбцу временной метки не будет автоматически присвоен атрибут DEFAULT CURRENT_TIMESTAMP или ON UPDATE CURRENT_TIMESTAMP. Здесь вы можете узнать больше об этой переменной.

  1. Использовать отметки времени с отметкой:

Измените $table->timestamps() на $table->nullableTimestamps() . По умолчанию команда $table->timestamps() создает поля timestamp, которые не имеют значения NULL. Используя $table->nullableTimestamps() , поля timestamp будут иметь значение NULL, и MySQL не будет автоматически назначать первый атрибут DEFAULT CURRENT_TIMESTAMP или ON UPDATE CURRENT_TIMESTAMP.

  1. Определите временные метки самостоятельно:

Вместо использования $table->timestamps используйте $table->timestamp('updated_at'); $table->timestamp('created_at'); $table->timestamp('updated_at'); $table->timestamp('created_at'); сам. Убедитесь, что поле «updated_at» является первой меткой времени в таблице, так что это будет тот, который автоматически присваивает атрибуты DEFAULT CURRENT_TIMESTAMP или ON UPDATE CURRENT_TIMESTAMP.

Skatch – Я думаю, что ваше решение выше не совсем правильно, но в этом случае это очень хорошо.

Проблема в том, что вы получаете дату PHP, а не временную метку MYSQL по умолчанию для своего значения по умолчанию. Когда вы запустите эту миграцию, вы получите следующее заявление:

 alter table alter column created_at default '2016:02:01 12:00:00'; 

Обратите внимание на строку для вашей даты. Когда вы запускаете свою миграцию, THAT date всегда будет использоваться для вашего created_at, а не текущей даты, когда запись будет добавлена ​​через несколько дней.

Вместо того, чтобы делать «date (« Y: m: d H: i: s »), вы можете сделать DB :: raw (« current_timestamp »), чтобы решить эту проблему.

(sry, не мог просто добавить комментарий выше – моя репутация еще недостаточно высока …)

Проводя это как ответ верхнего уровня, подведя итоги обсуждения комментариев.

Во-первых, в Laravel есть ошибка даты, как отмечено @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 :: unprepared (), чтобы применить его из своей миграции – например:

 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'); } }