2016-01-13 7 views
8

Я просто попал в ловушку с отметками времени по умолчанию Eloquent (Laravel 5.2.10). По умолчанию метод $table->timestamps() дает вам created_at и столбец updated_at в вашей таблице, которые соответствующим образом обновляются.Laravel Eloquent created_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? (Более важен)

ответ

5

Ваш вопрос, вероятно, связан с этим вопросом здесь: 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 отключен (по умолчанию), сделайте eithe r из следующего:

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

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

+0

Я запустил «обновление для композитора», которое привело меня к 5.2.10, но метод 'timestamps()' все еще не работал должным образом.Тем не менее, 'nullableTimestamps()' работает очень хорошо, поэтому я буду использовать это на данный момент (проблема, на которую вы указали мне, казалось, указывала, что это станет поведением 'timestamps()' по умолчанию, но пока это все еще не работает для меня. В любом случае, спасибо! – tam5

+1

@tam Извините, что с 5 часов назад (Laravel 5.2.9+) изменения были отменены, поэтому 'useCurrent()' не является поведением по умолчанию. Это вызвало некоторые проблемы с людьми которые используют более старую версию MySQL. –

+0

проблем нет. Спасибо за альтернативу и объяснения – tam5

Смежные вопросы