Med tanke på att det är ett råuttryck bör du använda DB::raw()
för att ställa in CURRENT_TIMESTAMP
som standardvärde för en kolumn:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Detta fungerar felfritt på alla databasdrivrutiner.
Från och med Laravel 5.1.25 (se PR 10962
och commit 15c487fe
) kan du nu använda den nya useCurrent()
kolumnmodifieringsmetod för att uppnå samma standardvärde för en kolumn:
$table->timestamp('created_at')->useCurrent();
Tillbaka till frågan, på MySQL kan du också använda ON UPDATE
klausul genom DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Återigen, från och med Laravel 8.36.0 (se PR 36817
) kan du nu använda den nya useCurrentOnUpdate()
kolumnmodifieringsmetoden tillsammans med useCurrent()
modifierare för att uppnå samma standardvärde för en kolumn:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Gotchas
-
MySQL
Börjar med MySQL 5.7,0000-00-00 00:00:00
anses inte längre vara ett giltigt datum. Som dokumenterats i Laravel 5.2 uppgraderingsguide , bör alla tidsstämpelkolumner få ett giltigt standardvärde när du infogar poster i din databas. Du kan användauseCurrent()
kolumnmodifierare (från Laravel 5.1.25 och senare) i dina migreringar för att förinställa tidsstämpelkolumnerna till de aktuella tidsstämplarna, eller så kan du göra tidsstämplarnanullable()
för att tillåta nollvärden. -
PostgreSQL &Laravel 4.x
I Laravel 4.x-versioner använde PostgreSQL-drivrutinen standarddatabasprecisionen för att lagra tidsstämpelvärden. När du använderCURRENT_TIMESTAMP
funktion på en kolumn med en standardprecision, PostgreSQL genererar en tidsstämpel med den högre precisionen som är tillgänglig, vilket genererar en tidsstämpel med en bråkdel av andra delen - se denna SQL-fiol .Detta kommer att leda till att Carbon misslyckas med att analysera en tidsstämpel eftersom den inte förväntar sig att mikrosekunder lagras. För att undvika att detta oväntade beteende bryter din ansökan måste du uttryckligen ge en nollprecision till
CURRENT_TIMESTAMP
fungerar enligt nedan:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Sedan Laravel 5.0,
timestamp()
kolumner har ändrats för att använda standardprecisionen noll som undviker detta.
Tack vare @andrewhl för att du påpekade problemet med Laravel 4.x i kommentarerna.
Tack vare @ChanakaKarunarathne
för att ta fram den nya useCurrentOnUpdate()
genväg i kommentarerna.