Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich den Standardwert einer Timestamp-Spalte mit Laravel-Migrationen auf den aktuellen Timestamp setzen?

Da es sich um einen Rohausdruck handelt, sollten Sie DB::raw() verwenden um CURRENT_TIMESTAMP festzulegen als Standardwert für eine Spalte:

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

Dies funktioniert einwandfrei auf jedem Datenbanktreiber.

Ab Laravel 5.1.25 (siehe PR 10962 ). und commit 15c487fe ) können Sie jetzt das neue useCurrent() verwenden Spaltenmodifikatormethode, um den gleichen Standardwert für eine Spalte zu erreichen:

$table->timestamp('created_at')->useCurrent();

Zurück zur Frage, bei MySQL könnte man auch den ON UPDATE verwenden -Klausel durch DB::raw() :

$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

Wieder ab Laravel 8.36.0 (siehe PR 36817 ). ) können Sie jetzt das neue useCurrentOnUpdate() verwenden Spaltenmodifikator-Methode zusammen mit useCurrent() Modifikator, um denselben Standardwert für eine Spalte zu erreichen:

$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();

Fallstricke

  • MySQL

    Ab MySQL 5.7, 0000-00-00 00:00:00 gilt nicht mehr als gültiges Datum. Wie im Laravel 5.2 Upgrade Guide dokumentiert , sollten alle Timestamp-Spalten einen gültigen Standardwert erhalten, wenn Sie Datensätze in Ihre Datenbank einfügen. Sie können useCurrent() verwenden Spaltenmodifikator (von Laravel 5.1.25 und höher) in Ihren Migrationen, um die Zeitstempelspalten standardmäßig auf die aktuellen Zeitstempel zu setzen, oder Sie können die Zeitstempel nullable() machen um Nullwerte zuzulassen.

  • PostgreSQL und Laravel 4.x

    In Laravel 4.x-Versionen verwendete der PostgreSQL-Treiber die standardmäßige Datenbankpräzision, um Zeitstempelwerte zu speichern. Bei Verwendung des CURRENT_TIMESTAMP Funktion für eine Spalte mit einer Standardgenauigkeit generiert PostgreSQL einen Zeitstempel mit der höheren verfügbaren Genauigkeit, wodurch ein Zeitstempel mit einem Sekundenbruchteil generiert wird - siehe diese SQL-Geige .

    Dies führt dazu, dass Carbon beim Parsen eines Zeitstempels fehlschlägt, da nicht erwartet wird, dass Mikrosekunden gespeichert werden. Um zu vermeiden, dass dieses unerwartete Verhalten Ihre Anwendung beschädigt, müssen Sie dem CURRENT_TIMESTAMP explizit eine Genauigkeit von Null zuweisen Funktion wie folgt:

      $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
    

    Seit Laravel 5.0 timestamp() Spalten wurde geändert, um eine Standardgenauigkeit von Null zu verwenden, wodurch dies vermieden wird.

Dank an @andrewhl für den Hinweis auf das Laravel 4.x-Problem in den Kommentaren.

Danke an @ChanakaKarunarathne für das Herausbringen des neuen useCurrentOnUpdate() Verknüpfung in den Kommentaren.