Biorąc pod uwagę, że jest to surowe wyrażenie, powinieneś użyć DB::raw()
aby ustawić CURRENT_TIMESTAMP
jako wartość domyślna dla kolumny:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Działa to bezbłędnie na każdym sterowniku bazy danych.
Od Laravel 5.1.25 (patrz PR 10962
i zatwierdź 15c487fe
) możesz teraz używać nowej useCurrent()
metoda modyfikatora kolumny w celu uzyskania tej samej wartości domyślnej dla kolumny:
$table->timestamp('created_at')->useCurrent();
Wracając do pytania, w MySQL możesz również użyć ON UPDATE
klauzula przez DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Ponownie, od wersji Laravel 8.36.0 (patrz PR 36817
) możesz teraz używać nowego useCurrentOnUpdate()
metoda modyfikatora kolumny wraz z useCurrent()
modyfikator, aby uzyskać tę samą domyślną wartość dla kolumny:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Gotcha
-
MySQL
Począwszy od MySQL 5.7,0000-00-00 00:00:00
nie jest już uważana za prawidłową datę. Jak opisano w przewodniku aktualizacji Laravel 5.2 , wszystkie kolumny sygnatury czasowej powinny otrzymać prawidłową wartość domyślną podczas wstawiania rekordów do bazy danych. Możesz użyćuseCurrent()
modyfikator kolumn (z Laravel 5.1.25 i nowszych) w twoich migracjach do domyślnych kolumn sygnatury czasowej na bieżące sygnatury czasowe lub możesz ustawić sygnatury czasowenullable()
aby zezwolić na wartości null. -
PostgreSQL i Laravel 4.x
W wersjach Laravel 4.x sterownik PostgreSQL używał domyślnej precyzji bazy danych do przechowywania wartości znaczników czasu. Podczas korzystania zCURRENT_TIMESTAMP
funkcji na kolumnie z domyślną precyzją, PostgreSQL generuje znacznik czasu o wyższej dostępnej precyzji, generując w ten sposób znacznik czasu z ułamkową drugą częścią - zobacz te skrzypce SQL .Doprowadzi to do tego, że Carbon nie przeanalizuje znacznika czasu, ponieważ nie będzie oczekiwał przechowywania mikrosekund. Aby uniknąć tego nieoczekiwanego zachowania powodującego uszkodzenie aplikacji, musisz jawnie podać zerową precyzję
CURRENT_TIMESTAMP
funkcja jak poniżej:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Od Laravela 5.0
timestamp()
kolumny zostały zmienione tak, aby używały domyślnej precyzji zero, co pozwala uniknąć tego.
Podziękowania dla @andrewhl za zwrócenie uwagi na problem Laravel 4.x w komentarzach.
Podziękowania dla @ChanakaKarunarathne
za wprowadzenie nowego useCurrentOnUpdate()
skrót w komentarzach.