Ham bir ifade olduğu için, bir sütun için varsayılan değer olarak DB::raw()
ayarlamanız gerekir CURRENT_TIMESTAMP
:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Bu, her veritabanı sürücüsünde kusursuz çalışır.
Yeni kısayol
Laravel 5.1.25'ten itibaren (bkz. PR 10962 ve taahhüt 15c487fe ) bir sütun için varsayılan değer olarak useCurrent()
ayarlamak için yeni sütun değiştirici yöntemini kullanabilirsiniz CURRENT_TIMESTAMP
:
$table->timestamp('created_at')->useCurrent();
Soruya geri dönersek, ON UPDATE
MySQL'de maddeyi şu şekillerde de kullanabilirsiniz DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Sorunlar
MySQL
MySQL 5.7 ile başlayarak 0000-00-00 00:00:00
geçerli bir tarih olarak kabul edilmez. Laravel 5.2 yükseltme kılavuzunda belgelendiği gibi , veritabanınıza kayıt eklediğinizde tüm zaman damgası sütunlarının geçerli bir varsayılan değer alması gerekir. Sen kullanabilir useCurrent()
şimdiki zaman damgaları için zaman damgası sütunları varsayılan sizin göçlerde (laravel 5.1.25 den ve üzeri) kolon değiştirici veya damgaları yapabilir nullable()
boş değerler izin vermek.
PostgreSQL ve Laravel 4.x
Laravel 4.x sürümlerinde PostgreSQL sürücüsü, zaman damgası değerlerini saklamak için varsayılan veritabanı hassasiyetini kullanıyordu. CURRENT_TIMESTAMP
Varsayılan bir hassasiyete sahip bir sütunda işlevi kullanırken , PostgreSQL daha yüksek hassasiyete sahip bir zaman damgası üretir, böylece kesirli ikinci bir bölüme sahip bir zaman damgası oluşturur - bu SQL kemanına bakın .
Bu, Karbon'un bir zaman damgasını ayrıştırmada başarısız olmasına neden olacağından, mikrosaniyelerin depolanmasını beklemez. Bu beklenmedik davranışın uygulamanızı bozmasını önlemek için, CURRENT_TIMESTAMP
işleve aşağıdaki gibi açıkça sıfır hassasiyet vermelisiniz :
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Laravel 5.0'dan bu yana, timestamp()
sütunlar varsayılan bir sıfır hassasiyeti kullanacak şekilde değiştirildi ve bu da bundan kaçındı .
@Andrewhl'e yorumlarda bu konuyu işaret ettiği için teşekkürler .
DB::statement
bunu kullan, çok daha basit.