Mengingat itu ekspresi mentah, Anda harus menggunakan DB::raw()
untuk menetapkan CURRENT_TIMESTAMP
sebagai nilai default untuk kolom:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Ini berfungsi dengan sempurna pada setiap driver basis data.
Pintasan baru
Pada Laravel 5.1.25 (lihat PR 10962 dan komit 15c487fe ), Anda dapat menggunakan useCurrent()
metode pengubah kolom baru untuk menetapkan CURRENT_TIMESTAMP
sebagai nilai default untuk kolom:
$table->timestamp('created_at')->useCurrent();
Kembali ke pertanyaan, pada MySQL Anda juga dapat menggunakan ON UPDATE
klausa melalui DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
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 Laravel 5.2 , semua kolom stempel waktu harus menerima nilai default yang valid saat Anda memasukkan catatan ke dalam basis data Anda. Anda dapat menggunakan useCurrent()
pengubah kolom (dari Laravel 5.1.25 dan di atas) dalam migrasi Anda untuk default kolom cap waktu ke cap waktu saat ini, atau Anda dapat membuat cap waktu nullable()
untuk memungkinkan nilai nol.
PostgreSQL & Laravel 4.x
Dalam versi Laravel 4.x, driver PostgreSQL menggunakan presisi database default untuk menyimpan nilai cap waktu. Ketika menggunakan CURRENT_TIMESTAMP
fungsi pada kolom dengan presisi default, PostgreSQL menghasilkan timestamp dengan presisi yang lebih tinggi, sehingga menghasilkan timestamp dengan bagian kedua fraksional - lihat biola SQL ini .
Ini akan menyebabkan Karbon gagal mengurai cap waktu karena tidak akan mengharapkan mikrodetik disimpan. Untuk menghindari perilaku tak terduga yang merusak aplikasi Anda, Anda harus secara eksplisit memberikan ketepatan nol untuk 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 ini.
Terima kasih kepada @andrewhl karena menunjukkan masalah ini di komentar.
DB::statement
contoh saya , ini jauh lebih sederhana.