Dato che è un'espressione grezza, dovresti usare DB::raw()
per impostare CURRENT_TIMESTAMP
come valore predefinito per una colonna:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Funziona perfettamente su ogni driver di database.
A partire da Laravel 5.1.25 (vedi PR 10962
e commit 15c487fe
) ora puoi usare il nuovo useCurrent()
metodo di modifica della colonna per ottenere lo stesso valore predefinito per una colonna:
$table->timestamp('created_at')->useCurrent();
Tornando alla domanda, su MySQL potresti anche usare ON UPDATE
clausola tramite DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Ancora una volta, a partire da Laravel 8.36.0 (vedi PR 36817
) ora puoi utilizzare il nuovo useCurrentOnUpdate()
metodo di modifica della colonna insieme a useCurrent()
modificatore per ottenere lo stesso valore predefinito per una colonna:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Gocce
-
MySQL
A partire da MySQL 5.7,0000-00-00 00:00:00
non è più considerata una data valida. Come documentato nella Guida all'aggiornamento di Laravel 5.2 , tutte le colonne timestamp dovrebbero ricevere un valore predefinito valido quando si inseriscono record nel database. Puoi usareuseCurrent()
modificatore di colonna (da Laravel 5.1.25 e versioni successive) nelle tue migrazioni per impostare come default le colonne timestamp sui timestamp correnti, oppure puoi rendere i timestampnullable()
per consentire valori nulli. -
PostgreSQL e Laravel 4.x
Nelle versioni di Laravel 4.x, il driver PostgreSQL utilizzava la precisione del database predefinita per memorizzare i valori di timestamp. Quando si utilizza ilCURRENT_TIMESTAMP
funzione su una colonna con una precisione predefinita, PostgreSQL genera un timestamp con la maggiore precisione disponibile, generando così un timestamp con una seconda parte frazionaria - vedi questo violino SQL .Ciò porterà Carbon a non riuscire ad analizzare un timestamp poiché non si aspetta che i microsecondi vengano archiviati. Per evitare che questo comportamento imprevisto rompa la tua applicazione devi dare esplicitamente una precisione zero al
CURRENT_TIMESTAMP
funzione come di seguito:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Da Laravel 5.0,
timestamp()
colonne è stato modificato per utilizzare una precisione predefinita pari a zero che evita questo.
Grazie a @andrewhl per aver segnalato il problema di Laravel 4.x nei commenti.
Grazie a @ChanakaKarunarathne
per far uscire il nuovo useCurrentOnUpdate()
scorciatoia nei commenti.