Biorąc pod uwagę, że jest to surowe wyrażenie, należy użyć, DB::raw()
aby ustawić CURRENT_TIMESTAMP
jako domyślną wartość kolumny:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Działa to bezbłędnie na każdym sterowniku bazy danych.
Nowy skrót
Od Laravel 5.1.25 (patrz PR 10962 i zatwierdzenie 15c487fe ) możesz użyć nowej useCurrent()
metody modyfikatora kolumn, aby ustawić CURRENT_TIMESTAMP
jako domyślną wartość dla kolumny:
$table->timestamp('created_at')->useCurrent();
Wracając do pytania, w MySQL możesz również użyć ON UPDATE
klauzuli poprzez DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Gotchas
MySQL
Począwszy od MySQL 5.7, 0000-00-00 00:00:00
nie jest już uważany za prawidłową datę. Jak udokumentowano w przewodniku aktualizacji Laravel 5.2 , wszystkie kolumny ze znacznikami czasu powinny otrzymać prawidłową wartość domyślną podczas wstawiania rekordów do bazy danych. Możesz użyć useCurrent()
modyfikatora kolumny (z Laravel 5.1.25 i nowszych) w swoich migracjach, aby ustawić domyślne kolumny znaczników czasu na bieżące znaczniki czasu lub możesz ustawić znaczniki czasu, nullable()
aby zezwalały 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. Używając CURRENT_TIMESTAMP
funkcji na kolumnie z domyślną precyzją, PostgreSQL generuje znacznik czasu z dostępną wyższą dokładnością, generując w ten sposób znacznik czasu z ułamkową drugą częścią - zobacz to skrzypce SQL .
Spowoduje to, że Carbon nie będzie mógł przeanalizować 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
funkcji, jak poniżej:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Od wersji Laravel 5.0 timestamp()
kolumny zostały zmienione, aby używać domyślnej precyzji równej zero, co pozwala uniknąć tego.
Podziękowania dla @andrewhl za wskazanie tego problemu w komentarzach.
DB::statement
przykładu, to jest znacznie prostsze.Aby utworzyć obie kolumny
created_at
iupdated_at
:Będziesz potrzebować MySQL w wersji> = 5.6.5, aby mieć wiele kolumn z rozszerzeniem
CURRENT_TIMESTAMP
źródło
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?updated_at
nie zmieniłoby się, gdy płyta została zmodyfikowana po jej początkowym utworzeniu$t->timestamps();
ale to nie odpowiada na pytanie.Począwszy od Laravel 5.1.26, oznaczonego dnia 2015-12-02, dodano
useCurrent()
modyfikator:PR 10962 (po którym następuje commit 15c487fe ) doprowadził do tego dodania.
Możesz także przeczytać wydania 3602 i 11518, które Cię interesują.
Zasadniczo MySQL 5.7 (z domyślną konfiguracją) wymaga zdefiniowania wartości domyślnej lub wartości null dla pól czasu.
źródło
To nie działa na fakt:
Nie usuwa `` domyślnego 0 '', które wydaje się pochodzić z wybrania znacznika czasu, a po prostu dodaje niestandardowe ustawienie domyślne. Ale potrzebujemy tego bez cudzysłowów. Nie wszystko, co manipuluje bazą danych, pochodzi z Laravel4. To jego punkt widzenia. Chce niestandardowych ustawień domyślnych w niektórych kolumnach, takich jak:
Nie sądzę, że jest to możliwe w przypadku Laravel. Szukałem już godzinę, żeby zobaczyć, czy to możliwe.
Aktualizacja: odpowiedź Paulosa Freity pokazuje, że jest to możliwe, ale składnia nie jest prosta.
źródło
Jako dodatkowa możliwość dla przyszłych pracowników Google
Uważam, że bardziej przydatne jest ustawienie wartości null w kolumnie updated_at, gdy rekord jest tworzony, ale nigdy nie był modyfikowany . Zmniejsza rozmiar bazy danych (ok, tylko trochę) i na pierwszy rzut oka widać, że dane nigdy nie były modyfikowane.
Od tego czasu używam:
(W Laravel 7 z mysql 8).
źródło
Zamiast tego skorzystaj z sugestii Paulo Freitas .
Dopóki Laravel tego nie naprawi, po uruchomieniu można uruchomić standardowe zapytanie do bazy danychSchema::create
.Zrobiło to dla mnie cuda.
źródło
Tak to się robi, sprawdziłem to i działa na moim Laravelu 4.2.
Mam nadzieję że to pomoże.
źródło
W Laravel 5 po prostu:
Dokumentacja: http://laravel.com/docs/5.1/migrations#creating-columns
źródło
CURRENT_TIMESTAMP
wcreated_at
kolumnie ion UPDATE CURRENT_TIMESTAMP
naupdated_at
kolumnie. Dopóki ludzie w Laravel nie naprawią tego, użyj tego:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));