Aangezien het een onbewerkte uitdrukking is, moet u DB::raw()
. gebruiken om CURRENT_TIMESTAMP
in te stellen als standaardwaarde voor een kolom:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Dit werkt feilloos op elk databasestuurprogramma.
Vanaf Laravel 5.1.25 (zie PR 10962
en commit 15c487fe
) kunt u nu de nieuwe useCurrent()
. gebruiken kolommodificatiemethode om dezelfde standaardwaarde voor een kolom te bereiken:
$table->timestamp('created_at')->useCurrent();
Terug naar de vraag, op MySQL zou je ook de ON UPDATE
. kunnen gebruiken clausule via DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Nogmaals, vanaf Laravel 8.36.0 (zie PR 36817
) kunt u nu de nieuwe useCurrentOnUpdate()
. gebruiken kolommodificatiemethode samen met de useCurrent()
modifier om dezelfde standaardwaarde voor een kolom te bereiken:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Gekregen
-
MySQL
Vanaf MySQL 5.7,0000-00-00 00:00:00
wordt niet langer als een geldige datum beschouwd. Zoals gedocumenteerd in de Laravel 5.2 upgradehandleiding , moeten alle tijdstempelkolommen een geldige standaardwaarde krijgen wanneer u records in uw database invoegt. U kunt deuseCurrent()
. gebruiken kolommodifier (van Laravel 5.1.25 en hoger) in uw migraties om de tijdstempelkolommen standaard op de huidige tijdstempels te zetten, of u kunt de tijdstempelsnullable()
maken om null-waarden toe te staan. -
PostgreSQL en Laravel 4.x
In Laravel 4.x-versies gebruikte het PostgreSQL-stuurprogramma de standaard databaseprecisie om tijdstempelwaarden op te slaan. Bij gebruik van deCURRENT_TIMESTAMP
functie op een kolom met een standaardprecisie, genereert PostgreSQL een tijdstempel met de hogere beschikbare precisie, waardoor een tijdstempel wordt gegenereerd met een fractioneel tweede deel - zie deze SQL-viool .Dit zal ertoe leiden dat Carbon een tijdstempel niet kan ontleden, omdat het niet verwacht dat microseconden worden opgeslagen. Om te voorkomen dat dit onverwachte gedrag uw toepassing verbreekt, moet u expliciet een nulprecisie geven aan de
CURRENT_TIMESTAMP
functie zoals hieronder:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Sinds Laravel 5.0,
timestamp()
kolommen is gewijzigd om een standaardprecisie van nul te gebruiken, waardoor dit wordt vermeden.
Met dank aan @andrewhl voor het wijzen op het Laravel 4.x-probleem in de opmerkingen.
Met dank aan @ChanakaKarunarathne
voor het uitbrengen van de nieuwe useCurrentOnUpdate()
snelkoppeling in de opmerkingen.