Mengingat itu adalah ekspresi mentah, Anda harus menggunakan DB::raw()
untuk menyetel CURRENT_TIMESTAMP
sebagai nilai default untuk kolom:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Ini bekerja dengan sempurna pada setiap driver database.
Pada Laravel 5.1.25 (lihat PR 10962
dan melakukan 15c487fe
) sekarang Anda dapat menggunakan useCurrent()
new yang baru metode pengubah kolom untuk mencapai nilai default yang sama untuk kolom:
$table->timestamp('created_at')->useCurrent();
Kembali ke pertanyaan, di MySQL Anda juga bisa menggunakan ON UPDATE
klausa melalui DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Sekali lagi, pada Laravel 8.36.0 (lihat PR 36817
) sekarang Anda dapat menggunakan useCurrentOnUpdate()
yang baru metode pengubah kolom bersama dengan useCurrent()
pengubah untuk mencapai nilai default yang sama untuk kolom:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Gotcha
-
MySQL
Dimulai dengan MySQL 5.7,0000-00-00 00:00:00
tidak lagi dianggap sebagai tanggal yang valid. Seperti yang didokumentasikan di Panduan peningkatan versi Laravel 5.2 , semua kolom stempel waktu akan menerima nilai default yang valid saat Anda memasukkan catatan ke dalam database Anda. Anda dapat menggunakanuseCurrent()
pengubah kolom (dari Laravel 5.1.25 dan di atasnya) dalam migrasi Anda ke default kolom stempel waktu ke stempel waktu saat ini, atau Anda dapat membuat stempel waktunullable()
untuk mengizinkan nilai nol. -
PostgreSQL &Laravel 4.x
Dalam versi Laravel 4.x, driver PostgreSQL menggunakan presisi database default untuk menyimpan nilai timestamp. Saat menggunakanCURRENT_TIMESTAMP
fungsi pada kolom dengan presisi default, PostgreSQL menghasilkan stempel waktu dengan presisi lebih tinggi yang tersedia, sehingga menghasilkan stempel waktu dengan bagian kedua pecahan - lihat biola SQL ini .Ini akan menyebabkan Carbon gagal mengurai cap waktu karena tidak akan mengharapkan mikrodetik disimpan. Untuk menghindari perilaku tak terduga yang merusak aplikasi Anda, Anda harus secara eksplisit memberikan presisi nol pada
CURRENT_TIMESTAMP
fungsi seperti di bawah ini:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Sejak Laravel 5.0,
timestamp()
kolom telah diubah untuk menggunakan presisi default nol yang menghindari hal ini.
Terima kasih kepada @andrewhl untuk menunjukkan masalah Laravel 4.x di komentar.
Terima kasih kepada @ChanakaKarunarathne
untuk mengeluarkan useCurrentOnUpdate()
new yang baru pintasan di komentar.