Da es sich um einen unformatierten Ausdruck handelt, sollten Sie DB::raw()
Folgendes CURRENT_TIMESTAMP
als Standardwert für eine Spalte festlegen :
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Dies funktioniert einwandfrei auf jedem Datenbanktreiber.
Neue Verknüpfung
Ab Laravel 5.1.25 (siehe PR 10962 und Commit 15c487fe ) können Sie die neue useCurrent()
Spaltenmodifikatormethode verwenden, um den CURRENT_TIMESTAMP
Standardwert für eine Spalte festzulegen :
$table->timestamp('created_at')->useCurrent();
Zurück zur Frage, unter MySQL können Sie die ON UPDATE
Klausel auch verwenden durch DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Fallstricke
MySQL
Ab MySQL 5.7 0000-00-00 00:00:00
gilt kein gültiges Datum mehr. Wie im Upgrade-Handbuch für Laravel 5.2 dokumentiert , sollten alle Zeitstempelspalten einen gültigen Standardwert erhalten, wenn Sie Datensätze in Ihre Datenbank einfügen. Sie können den useCurrent()
Spaltenmodifikator (ab Laravel 5.1.25 und höher) in Ihren Migrationen verwenden, um die Zeitstempelspalten auf die aktuellen Zeitstempel zu setzen, oder Sie können die Zeitstempel so einstellen nullable()
, dass Nullwerte zulässig sind.
PostgreSQL & Laravel 4.x
In Laravel 4.x-Versionen verwendete der PostgreSQL-Treiber die Standarddatenbankgenauigkeit zum Speichern von Zeitstempelwerten. Wenn Sie die CURRENT_TIMESTAMP
Funktion für eine Spalte mit einer Standardgenauigkeit verwenden, generiert PostgreSQL einen Zeitstempel mit der höheren verfügbaren Genauigkeit und generiert so einen Zeitstempel mit einem Bruchteil des zweiten Teils - siehe diese SQL-Geige .
Dies führt dazu, dass Carbon einen Zeitstempel nicht analysiert, da nicht erwartet wird, dass Mikrosekunden gespeichert werden. Um zu vermeiden, dass dieses unerwartete Verhalten Ihre Anwendung beschädigt, müssen Sie der CURRENT_TIMESTAMP
Funktion wie folgt explizit eine Genauigkeit von Null geben :
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Seit Laravel 5.0 wurden timestamp()
Spalten geändert, um eine Standardgenauigkeit von Null zu verwenden, wodurch dies vermieden wird.
Vielen Dank an @andrewhl für den Hinweis auf dieses Problem in den Kommentaren.
DB::statement
Beispiels, dies ist viel einfacher.So erstellen Sie sowohl das
created_at
als auchupdated_at
Spalten:Sie benötigen MySQL Version> = 5.6.5, um mehrere Spalten mit zu haben
CURRENT_TIMESTAMP
quelle
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?updated_at
nicht ändern würde, wenn der Datensatz nach seiner ersten Erstellung geändert wurde$t->timestamps();
aber das beantwortet die Frage nicht.Ab Laravel 5.1.26, markiert am 02.12.2015, wurde ein
useCurrent()
Modifikator hinzugefügt:PR 10962 (gefolgt von Commit 15c487fe ) führte zu diesem Zusatz.
Möglicherweise möchten Sie auch die Ausgaben 3602 und 11518 lesen die von Interesse sind.
Grundsätzlich müssen Sie in MySQL 5.7 (mit Standardkonfiguration) entweder einen Standardwert definieren oder für Zeitfelder nullwertfähig sein.
quelle
Das funktioniert nicht für eine Tatsache:
Es entfernt nicht die 'Standard 0', die mit der Auswahl des Zeitstempels zu kommen scheint, und fügt nur den benutzerdefinierten Standard hinzu. Aber wir brauchen es irgendwie ohne die Zitate. Nicht alles, was eine Datenbank manipuliert, stammt von Laravel4. Das ist sein Punkt. Er möchte benutzerdefinierte Standardeinstellungen für bestimmte Spalten wie:
Ich denke nicht, dass es mit Laravel möglich ist. Ich habe jetzt seit einer Stunde gesucht, um zu sehen, ob es möglich ist.
Update: Paulos Freitas Antwort zeigt, dass es möglich ist, aber die Syntax ist nicht einfach.
quelle
Als zusätzliche Möglichkeit für zukünftige Googler
Ich finde es nützlicher, null in der Spalte "update_at" zu haben, wenn der Datensatz erstellt, aber nie geändert wurde . Es reduziert die Datenbankgröße (ok, nur ein wenig) und es ist auf den ersten Blick erkennbar, dass die Daten nie geändert wurden.
Ab diesem Zeitpunkt benutze ich:
(In Laravel 7 mit MySQL 8).
quelle
Verwenden Sie stattdessen den Vorschlag von Paulo Freitas .
Bis Laravel dies behebt, können Sie nach der Ausführung eine Standard-DatenbankabfrageSchema::create
ausführen.Es hat Wunder für mich gewirkt.
quelle
So machst du es, ich habe es überprüft und es funktioniert auf meinem Laravel 4.2.
Hoffe das hilft.
quelle
In Laravel 5 einfach:
Dokumentation: http://laravel.com/docs/5.1/migrations#creating-columns
quelle
CURRENT_TIMESTAMP
oncreated_at
column undon UPDATE CURRENT_TIMESTAMP
onupdated_at
column nicht. Bis Leute bei Laravel es reparieren, verwenden Sie dieses:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));