Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso definir o valor padrão de uma coluna de carimbo de data/hora para o carimbo de data/hora atual com as migrações do Laravel?


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 o useCurrent() 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 timestamps nullable() 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 o CURRENT_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 ao CURRENT_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.