Dado que é uma expressão bruta, você deve usar
DB::raw()
para definir CURRENT_TIMESTAMP
como um valor padrão para uma coluna:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Isso funciona perfeitamente em todos os drivers de banco de dados.
A partir do Laravel 5.1.25 (consulte PR 10962 e commit 15c487fe ) agora você pode usar o novo
useCurrent()
método modificador de coluna para obter o mesmo valor padrão para uma coluna:$table->timestamp('created_at')->useCurrent();
De volta à pergunta, no MySQL você também pode usar o
ON UPDATE
cláusula através de DB::raw()
:$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Novamente, a partir do Laravel 8.36.0 (consulte PR 36817 ) agora você pode usar o novo
useCurrentOnUpdate()
método modificador de coluna junto com o useCurrent()
modificador para obter o mesmo valor padrão para uma coluna:$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Pegadinhas
-
MySQL
Começando com MySQL 5.7,0000-00-00 00:00:00
não é mais considerada uma data válida. Conforme documentado no Guia de atualização do Laravel 5.2 , todas as colunas de carimbo de data/hora devem receber um valor padrão válido quando você inserir registros em seu banco de dados. Você pode usar ouseCurrent()
modificador de coluna (do Laravel 5.1.25 e superior) em suas migrações para padronizar as colunas de timestamp para os timestamps atuais, ou você pode fazer os timestampsnullable()
para permitir valores nulos.
-
PostgreSQL e Laravel 4.x
Nas versões Laravel 4.x, o driver PostgreSQL estava usando a precisão padrão do banco de dados para armazenar valores de timestamp. Ao usar oCURRENT_TIMESTAMP
função em uma coluna com uma precisão padrão, o PostgreSQL gera um timestamp com a maior precisão disponível, gerando assim um timestamp com uma fração de segundo - veja este violino SQL .
Isso fará com que o Carbon falhe na análise de um carimbo de data/hora, pois não estará esperando microssegundos sendo armazenados. Para evitar que esse comportamento inesperado interrompa seu aplicativo, você deve fornecer explicitamente uma precisão zero aoCURRENT_TIMESTAMP
funcionar como abaixo:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Desde o Laravel 5.0,timestamp()
colunas foi alterada para usar uma precisão padrão de zero, o que evita isso.
Agradecimentos a @andrewhl por apontar o problema do Laravel 4.x nos comentários.
Agradecimentos a @ChanakaKarunarathne por trazer o novo
useCurrentOnUpdate()
atalho nos comentários.