Учитывая, что это необработанное выражение, вы должны использовать DB::raw()
, чтобы установить CURRENT_TIMESTAMP
в качестве значения по умолчанию для столбца:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Это безупречно работает с каждым драйвером базы данных.
Начиная с Laravel 5.1.25 (см. PR 10962 и commit 15c487fe) теперь вы можете использовать новый метод модификатора столбца useCurrent()
для достижения того же значения по умолчанию для столбца:
$table->timestamp('created_at')->useCurrent();
Возвращаясь к вопросу, в MySQL вы также можете использовать предложения от ON UPDATE
до DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Опять же, начиная с Laravel 8.36.0 (см. PR 36817) теперь вы можете использовать новый useCurrentOnUpdate()
метод модификатора столбца вместе с модификатором useCurrent()
для достижения того же значения по умолчанию для столбца:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Попался
MySQL
Начиная с MySQL 5.7, 0000-00-00 00:00:00
больше не считается действительной датой. Как указано в руководстве по обновлению Laravel 5.2, все столбцы временных меток должны получить допустимое значение по умолчанию при вставке записей в базу данных. Вы можете использовать модификатор столбца useCurrent()
(из Laravel 5.1.25 и выше) в своих миграциях, чтобы по умолчанию столбцы меток времени соответствовали текущим меткам времени, или вы можете сделать метки времени nullable()
, чтобы разрешить нулевые значения.
PostgreSQL и Laravel 4.x
В версиях Laravel 4.x драйвер PostgreSQL использовал точность базы данных по умолчанию для хранения значений временных меток. При использовании функции CURRENT_TIMESTAMP
в столбце с точностью по умолчанию PostgreSQL генерирует метку времени с более высокой доступной точностью, таким образом, генерируя метку времени с дробной второй частью - см. Эту скрипту SQL.
Это приведет к тому, что Carbon не сможет проанализировать временную метку, поскольку он не будет ожидать сохранения микросекунд. Чтобы избежать этого неожиданного поведения, нарушающего работу вашего приложения, вы должны явно указать нулевую точность функции CURRENT_TIMESTAMP
, как показано ниже:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Начиная с Laravel 5.0, timestamp()
столбцов были изменены, чтобы использовать точность по умолчанию, равную нулю, что позволяет избежать этого.
Спасибо @andrewhl за указание на проблему Laravel 4.x в комментариях.
Спасибо @ChanakaKarunarathne за то, что добавили новый ярлык useCurrentOnUpdate()
в комментарии.
person
Paulo Freitas
schedule
29.12.2013