Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso impostare il valore predefinito di una colonna timestamp sul timestamp corrente con le migrazioni di Laravel?

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 usare useCurrent() 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 timestamp nullable() 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 il CURRENT_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.