Учитывая, что это необработанное выражение, вы должны использовать DB::raw()
его CURRENT_TIMESTAMP
в качестве значения по умолчанию для столбца:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Это работает безупречно на каждом драйвере базы данных.
Новый ярлык
Начиная с Laravel 5.1.25 (см. PR 10962 и коммит 15c487fe ), вы можете использовать новый useCurrent()
метод модификатора столбца, чтобы установить CURRENT_TIMESTAMP
значение по умолчанию для столбца:
$table->timestamp('created_at')->useCurrent();
Возвращаясь к вопросу, на MySQL вы также можете использовать ON UPDATE
предложение через DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Gotchas
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 за указание на эту проблему в комментариях.
DB::statement
примера, это намного проще.Для того, чтобы создать как из
created_at
иupdated_at
столбцов:Вам потребуется версия MySQL> = 5.6.5, чтобы иметь несколько столбцов с
CURRENT_TIMESTAMP
источник
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?updated_at
не изменится, когда запись была изменена после ее первоначального создания$t->timestamps();
но это не отвечает на вопрос.Начиная с Laravel 5.1.26, отмеченного 2015-12-02, добавлен
useCurrent()
модификатор:PR 10962 (сопровождаемый коммитом 15c487fe ) привел к этому добавлению.
Вы также можете прочитать выпуски 3602 и 11518, которые представляют интерес.
По сути, MySQL 5.7 (с конфигурацией по умолчанию) требует, чтобы вы определяли либо значение по умолчанию, либо значение NULL для полей времени.
источник
Это не работает на самом деле:
Он не удаляет «по умолчанию 0», который, кажется, идет с выбором метки времени, а просто добавляет пользовательское значение по умолчанию. Но нам это нужно без кавычек. Не все, что манипулирует БД, исходит от Laravel4. Это его точка зрения. Он хочет использовать пользовательские настройки по умолчанию для определенных столбцов, таких как:
Я не думаю, что это возможно с Laravel. Я искал час, чтобы посмотреть, возможно ли это.
Обновление: ответ Паулоса Фрейты показывает, что это возможно, но синтаксис не прост.
источник
Как дополнительная возможность для будущих гуглеров
Я считаю более полезным иметь значение NULL в столбце updated_at, когда запись создана, но никогда не изменялась . Это уменьшает размер БД (хорошо, только немного) и его можно увидеть с первого взгляда, что данные никогда не изменялись.
По состоянию на это я использую:
(В Laravel 7 с MySQL 8).
источник
Вместо этого используйте предложение Пауло Фрейтаса .
Пока Laravel не исправит это, вы можете запустить стандартный запрос к базе данных после того, какSchema::create
он был выполнен.Это творило чудеса для меня.
источник
Вот как ты это делаешь, я проверил, и он работает на моем Laravel 4.2.
Надеюсь это поможет.
источник
В Laravel 5 просто:
Документация: http://laravel.com/docs/5.1/migrations#creating-columns
источник
CURRENT_TIMESTAMP
наcreated_at
колонке иon UPDATE CURRENT_TIMESTAMP
наupdated_at
колонке. Пока люди в Laravel исправят это, используйте это:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));