Vzhledem k tomu, že se jedná o nezpracovaný výraz, měli byste použít DB::raw()
nastavte CURRENT_TIMESTAMP
jako výchozí hodnota pro sloupec:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Toto funguje bezchybně na každém ovladači databáze.
Od Laravel 5.1.25 (viz PR 10962
a commit 15c487fe
) nyní můžete použít nové useCurrent()
metoda modifikátoru sloupců k dosažení stejné výchozí hodnoty pro sloupec:
$table->timestamp('created_at')->useCurrent();
Zpět k otázce, na MySQL můžete také použít ON UPDATE
klauzule prostřednictvím DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Opět platí, že od Laravelu 8.36.0 (viz PR 36817
) nyní můžete použít nové useCurrentOnUpdate()
metoda modifikátoru sloupce spolu s useCurrent()
modifikátor pro dosažení stejné výchozí hodnoty pro sloupec:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Mám potíže
-
MySQL
Počínaje MySQL 5.7,0000-00-00 00:00:00
se již nepovažuje za platné datum. Jak je zdokumentováno v průvodci upgradem Laravel 5.2 , měly by všechny sloupce časových razítek obdržet platnou výchozí hodnotu, když vkládáte záznamy do databáze. Můžete použítuseCurrent()
modifikátor sloupců (od Laravel 5.1.25 a vyšší) ve vašich migracích na výchozí nastavení sloupců časových značek na aktuální časová razítka, nebo můžete časová razítka nastavit nanullable()
pro povolení hodnot null. -
PostgreSQL a Laravel 4.x
Ve verzích Laravel 4.x používal ovladač PostgreSQL výchozí databázovou přesnost k ukládání hodnot časového razítka. Při použitíCURRENT_TIMESTAMP
funkce na sloupci s výchozí přesností, PostgreSQL generuje časové razítko s vyšší dostupnou přesností, čímž generuje časové razítko se zlomkovou druhou částí - viz tyto housle SQL .To povede k tomu, že Carbon selže při analýze časového razítka, protože nebude očekávat uložení mikrosekund. Abyste se vyhnuli tomuto neočekávanému chování, které by narušilo vaši aplikaci, musíte výslovně zadat nulovou přesnost
CURRENT_TIMESTAMP
funkce, jak je uvedeno níže:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Od Laravelu 5.0
timestamp()
sloupců byl změněn tak, aby používal výchozí přesnost nula, což tomu zabrání.
Děkujeme @andrewhl za upozornění na problém Laravel 4.x v komentářích.
Děkujeme @ChanakaKarunarathne
pro uvedení nového useCurrentOnUpdate()
zástupce v komentářích.