Da det er et råt udtryk, bør du bruge DB::raw()
for at indstille CURRENT_TIMESTAMP
som standardværdi for en kolonne:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Dette fungerer upåklageligt på alle databasedrivere.
Fra Laravel 5.1.25 (se PR 10962
og commit 15c487fe
) kan du nu bruge den nye useCurrent()
kolonnemodifikatormetode for at opnå den samme standardværdi for en kolonne:
$table->timestamp('created_at')->useCurrent();
Tilbage til spørgsmålet, på MySQL kan du også bruge ON UPDATE
klausul gennem DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Igen, fra Laravel 8.36.0 (se PR 36817
) kan du nu bruge den nye useCurrentOnUpdate()
kolonnemodifikatormetoden sammen med useCurrent()
modifikator for at opnå den samme standardværdi for en kolonne:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Gotchas
-
MySQL
Starter med MySQL 5.7,0000-00-00 00:00:00
betragtes ikke længere som en gyldig dato. Som dokumenteret i Laravel 5.2-opgraderingsvejledningen , bør alle tidsstempelkolonner modtage en gyldig standardværdi, når du indsætter poster i din database. Du kan brugeuseCurrent()
kolonnemodifikator (fra Laravel 5.1.25 og nyere) i dine migreringer til standardtidsstempelkolonnerne til de aktuelle tidsstempler, eller du kan gøre tidsstemplernenullable()
for at tillade nulværdier. -
PostgreSQL &Laravel 4.x
I Laravel 4.x-versioner brugte PostgreSQL-driveren standarddatabasenøjagtigheden til at gemme tidsstempelværdier. Når du brugerCURRENT_TIMESTAMP
funktion på en kolonne med en standardpræcision, genererer PostgreSQL et tidsstempel med den højere præcision, der er tilgængelig, og genererer således et tidsstempel med en brøkdel af anden del - se denne SQL-fiol .Dette vil få Carbon til at mislykkes med at parse et tidsstempel, da det ikke vil forvente, at mikrosekunder bliver gemt. For at undgå, at denne uventede adfærd bryder din applikation, skal du udtrykkeligt give en nul-præcision til
CURRENT_TIMESTAMP
fungerer som nedenfor:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Siden Laravel 5.0,
timestamp()
kolonner er blevet ændret til at bruge en standardpræcision på nul, hvilket undgår dette.
Tak til @andrewhl for at påpege Laravel 4.x-problemet i kommentarerne.
Tak til @ChanakaKarunarathne
for at bringe den nye useCurrentOnUpdate()
ud genvej i kommentarerne.