Como é uma expressão bruta, você deve DB::raw()
definir CURRENT_TIMESTAMP
como 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.
Novo atalho
No Laravel 5.1.25 (consulte PR 10962 e commit 15c487fe ), você pode usar o novo useCurrent()
método de modificação de colunas para definir o CURRENT_TIMESTAMP
valor padrão para uma coluna:
$table->timestamp('created_at')->useCurrent();
De volta à pergunta, no MySQL você também pode usar a ON UPDATE
cláusula através de DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Pegadinhas
MySQL
A partir do 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ê insere registros no seu banco de dados. Você pode usar o useCurrent()
modificador de coluna (do Laravel 5.1.25 e posterior) em suas migrações para padronizar as colunas de carimbo de data / hora para os carimbos de hora atuais ou pode fazer os carimbos nullable()
de hora para permitir valores nulos.
PostgreSQL e Laravel 4.x
Nas versões do Laravel 4.x, o driver do PostgreSQL usava a precisão padrão do banco de dados para armazenar valores de carimbo de data / hora. Ao usar a CURRENT_TIMESTAMP
função em uma coluna com uma precisão padrão, o PostgreSQL gera um registro de data e hora com a maior precisão disponível, gerando um registro de data e hora com uma segunda parte fracionária - veja este violino SQL .
Isso levará o Carbon a falhar na análise de um carimbo de data / hora, uma vez que não estará esperando microssegundos sendo armazenados. Para evitar esse comportamento inesperado que interrompe seu aplicativo, você precisa explicitamente dar uma precisão zero à CURRENT_TIMESTAMP
função, conforme abaixo:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Desde o Laravel 5.0, as timestamp()
colunas foram alteradas para usar uma precisão padrão zero, o que evita isso.
Agradecemos a @andrewhl por apontar esse problema nos comentários.
DB::statement
exemplo, isso é muito mais simples.