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.Untuk membuat kolom
created_at
dan keduanyaupdated_at
:Anda memerlukan versi MySQL> = 5.6.5 untuk memiliki banyak kolom
CURRENT_TIMESTAMP
sumber
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?updated_at
tidak akan berubah ketika catatan itu diubah setelah penciptaan awal$t->timestamps();
tetapi itu tidak menjawab pertanyaan.Mulai dari Laravel 5.1.26, ditandai pada 2015-12-02,
useCurrent()
pengubah telah ditambahkan:PR 10962 (diikuti oleh commit 15c487fe ) mengarah ke penambahan ini.
Anda mungkin juga ingin membaca masalah 3602 dan 11518 yang menarik.
Pada dasarnya, MySQL 5.7 (dengan konfigurasi default) mengharuskan Anda untuk menentukan nilai default atau nullable untuk bidang waktu.
sumber
Ini tidak bekerja untuk fakta:
Itu tidak menghapus 'default 0' yang tampaknya datang dengan memilih stempel waktu dan itu hanya menambahkan standar kustom. Tapi kami membutuhkannya tanpa tanda kutip. Tidak semua yang memanipulasi DB berasal dari Laravel4. Itu intinya. Dia ingin standar kustom pada kolom tertentu seperti:
Saya tidak berpikir itu mungkin dengan Laravel. Saya sudah mencari satu jam sekarang untuk melihat apakah itu mungkin.
Update: Paulos Freita ini jawaban menunjukkan bahwa adalah mungkin, tetapi sintaks tidak langsung.
sumber
Sebagai kemungkinan tambahan untuk googler masa depan
Saya merasa lebih bermanfaat untuk memiliki null di kolom updated_at ketika catatan dibuat tetapi belum pernah dimodifikasi . Ini mengurangi ukuran db (ok, hanya sedikit) dan memungkinkan untuk melihatnya pada pandangan pertama bahwa data tidak pernah dimodifikasi.
Sampai saat ini saya menggunakan:
(Dalam Laravel 7 dengan mysql 8).
sumber
Gunakan saran Paulo Freitas sebagai gantinya.
Sampai Laravel memperbaiki ini, Anda dapat menjalankan kueri basis data standar setelahSchema::create
dijalankan.Itu bekerja keajaiban bagi saya.
sumber
Ini adalah bagaimana Anda melakukannya, saya telah memeriksanya dan berfungsi pada Laravel 4.2 saya.
Semoga ini membantu.
sumber
Dalam Laravel 5 secara sederhana:
Dokumentasi: http://laravel.com/docs/5.1/migrations#creating-columns
sumber
CURRENT_TIMESTAMP
padacreated_at
kolom danon UPDATE CURRENT_TIMESTAMP
padaupdated_at
kolom. Sampai orang-orang di Laravel memperbaikinya, gunakan ini:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));