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.Para criar as colunas
created_at
eupdated_at
:Você precisará da versão MySQL> = 5.6.5 para ter várias colunas com
CURRENT_TIMESTAMP
fonte
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?updated_at
não mudaria quando o registro foi modificado após sua criação inicial$t->timestamps();
mas isso não responde à pergunta.A partir do Laravel 5.1.26, marcado com 02/12/2015, um
useCurrent()
modificador foi adicionado:O PR 10962 (seguido pelo commit 15c487fe ) levou a essa adição.
Você também pode ler os problemas 3602 e 11518 que são de interesse.
Basicamente, o MySQL 5.7 (com configuração padrão) requer que você defina um valor padrão ou anulável para os campos de tempo.
fonte
Isso não funciona de fato:
Ele não remove o 'padrão 0' que parece vir com a seleção do carimbo de data e hora e apenas acrescenta o padrão personalizado. Mas meio que precisamos disso sem as aspas. Nem tudo o que manipula um banco de dados vem do Laravel4. Esse é o ponto dele. Ele deseja padrões personalizados em determinadas colunas, como:
Não acho que seja possível com o Laravel. Estou procurando há uma hora agora para ver se é possível.
Atualização: A resposta de Paulos Freita mostra que é possível, mas a sintaxe não é direta.
fonte
Como possibilidade adicional para futuros googlers
Acho mais útil ter nulo na coluna updated_at quando o registro é criado, mas nunca foi modificado . Reduz o tamanho do banco de dados (ok, apenas um pouco) e é possível vê-lo à primeira vista que os dados nunca foram modificados.
A partir disso, eu uso:
(No Laravel 7 com o mysql 8).
fonte
Use a sugestão de Paulo Freitas .
Até o Laravel corrigir isso, você pode executar uma consulta padrão ao banco de dados após aSchema::create
execução.Isso funcionou maravilhosamente para mim.
fonte
É assim que você faz, eu verifiquei e funciona no meu Laravel 4.2.
Espero que isto ajude.
fonte
No Laravel 5, basta:
Documentação: http://laravel.com/docs/5.1/migrations#creating-columns
fonte
CURRENT_TIMESTAMP
nacreated_at
coluna eon UPDATE CURRENT_TIMESTAMP
naupdated_at
coluna. Até que o pessoal do Laravel conserte, use o seguinte:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));