Laravel Eloquent created_at обновляется

Я только что столкнулся с проблемой с временными метками Eloquent (Laravel 5.2.10) по умолчанию. По умолчанию метод $table->timestamps() дает вам столбцы created_at и updated_at в вашей таблице, которые соответственно обновляются.

Однако, когда я пробовал некоторые тестовые записи, я заметил, что при обновлении записи поле updated_at обновляется, как и должно, но поле created_at также обновляется: его часы остаются на созданном время, но минуты и секунды обновляются, чтобы соответствовать полю updated_at.

Если это было слишком многословно, вот пример:

+---------------------+---------------------+
| created_at          | updated_at          |
+---------------------+---------------------+
| 2016-01-13 17:13:27 | 2016-01-13 22:13:27 |
| 2016-01-13 16:14:41 | 2016-01-13 21:14:41 |
+---------------------+---------------------+

Обратите внимание, что минуты и секунды в полях created_at и updated_at совпадают.

Я попытался просмотреть класс Model, где установлены временные метки, но оказалось, что метод setCreatedAt() действительно не вызывается при простом обновлении записи.

Почему это происходит?
Как предотвратить изменение поля created_at? (более важный)


person tam5    schedule 13.01.2016    source источник


Ответы (1)


Ваша проблема, вероятно, связана с этой проблемой здесь: https://github.com/laravel/framework/issues/11518

Короче говоря, столбец created_at многих людей имел атрибут ON UPDATE CURRENT_TIMESTAMP.

Как указано на странице Github:

MySQL 5.7 больше не допускает 0000-00-00 в качестве действительной временной метки при включенном строгом режиме (который используется по умолчанию). Так что либо используйте ->nullableTimestamps(), либо ->timestamp()->useCurrent().

Итак, вы можете исправить это, изменив это:

$table->timestamps();

К любому из этих вариантов:

// Option 1:
$table->nullableTimestamps();

// Option 2:
$table->timestamp('updated_at')->useCurrent();
$table->timestamp('created_at')->useCurrent();

Также на этой странице MySQL: https://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

В качестве альтернативы, если explicit_defaults_for_timestamp отключен (по умолчанию), выполните одно из следующих действий:

Определите столбец с предложением DEFAULT, которое задает постоянное значение по умолчанию.

Укажите атрибут NULL. Это также приводит к тому, что столбец допускает значения NULL, что означает, что вы не можете назначить текущую метку времени, установив для столбца значение NULL. Присвоение NULL устанавливает столбец в NULL.

person Thomas Kim    schedule 13.01.2016
comment
Я запустил composer update, который привел меня к 5.2.10, но метод timestamps() по-прежнему не работал должным образом. Тем не менее, nullableTimestamps() работает очень хорошо, поэтому я буду использовать его сейчас (проблема, на которую вы мне указали, указывала на то, что это станет поведением timestamps() по умолчанию, но пока это все еще не работает для меня. В любом случае, спасибо! - person tam5; 14.01.2016
comment
@tam Прости за это. По состоянию на 5 часов назад (Laravel 5.2.9+) изменения были отменены, поэтому useCurrent() не является поведением по умолчанию. Это вызвало некоторые проблемы у людей, которые используют более старую версию MySQL. - person Thomas Kim; 14.01.2016
comment
нет проблем. Спасибо за альтернативу и пояснения - person tam5; 14.01.2016