Я нашел этот ответ на эту тему, но это не работает для меня.
Итак, я делаю запись в базе данных:
// 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 при определенных условиях.
В принципе, у вас есть три варианта.
Если вы установите для переменной explicit_defaults_for_timestamp
значение TRUE
, столбцу временной метки не будет автоматически присвоен атрибут DEFAULT CURRENT_TIMESTAMP или ON UPDATE CURRENT_TIMESTAMP. Здесь вы можете узнать больше об этой переменной.
Измените $table->timestamps()
на $table->nullableTimestamps()
. По умолчанию команда $table->timestamps()
создает поля timestamp, которые не имеют значения NULL. Используя $table->nullableTimestamps()
, поля timestamp будут иметь значение NULL, и MySQL не будет автоматически назначать первый атрибут DEFAULT CURRENT_TIMESTAMP или ON UPDATE CURRENT_TIMESTAMP.
Вместо использования $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'); } }