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önnenuseCurrent()
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 Zeitstempelnullable()
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 desCURRENT_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.