Como é uma expressão bruta, você deve DB::raw()definir CURRENT_TIMESTAMPcomo 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_TIMESTAMPvalor padrão para uma coluna:
$table->timestamp('created_at')->useCurrent();
De volta à pergunta, no MySQL você também pode usar a ON UPDATEclá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:00nã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_TIMESTAMPfunçã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_TIMESTAMPfunçã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::statementexemplo, isso é muito mais simples.