Vì đó là một biểu thức thô, bạn nên sử dụng DB::raw()
để đặt CURRENT_TIMESTAMP
làm giá trị mặc định cho một cột:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Điều này hoạt động hoàn hảo trên mọi trình điều khiển cơ sở dữ liệu.
Kể từ Laravel 5.1.25 (xem PR 10962
và cam kết 15c487fe
) bây giờ bạn có thể sử dụng useCurrent()
mới phương thức sửa đổi cột để đạt được cùng một giá trị mặc định cho một cột:
$table->timestamp('created_at')->useCurrent();
Quay lại câu hỏi, trên MySQL, bạn cũng có thể sử dụng ON UPDATE
mệnh đề thông qua DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Một lần nữa, kể từ Laravel 8.36.0 (xem PR 36817
) bây giờ bạn có thể sử dụng useCurrentOnUpdate()
mới phương thức bổ trợ cột cùng với useCurrent()
sửa đổi để đạt được cùng một giá trị mặc định cho một cột:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Gotchas
-
MySQL
Bắt đầu với MySQL 5.7,0000-00-00 00:00:00
không còn được coi là một ngày hợp lệ. Như đã nêu tại hướng dẫn nâng cấp Laravel 5.2 , tất cả các cột dấu thời gian sẽ nhận giá trị mặc định hợp lệ khi bạn chèn bản ghi vào cơ sở dữ liệu của mình. Bạn có thể sử dụnguseCurrent()
công cụ sửa đổi cột (từ Laravel 5.1.25 trở lên) trong quá trình di chuyển của bạn để mặc định các cột dấu thời gian thành dấu thời gian hiện tại hoặc bạn có thể đặt dấu thời giannullable()
để cho phép các giá trị rỗng. -
PostgreSQL &Laravel 4.x
Trong các phiên bản Laravel 4.x, trình điều khiển PostgreSQL đang sử dụng độ chính xác cơ sở dữ liệu mặc định để lưu trữ các giá trị dấu thời gian. Khi sử dụngCURRENT_TIMESTAMP
chức năng trên cột có độ chính xác mặc định, PostgreSQL tạo dấu thời gian có độ chính xác cao hơn hiện có, do đó tạo dấu thời gian có phần thứ hai phân số - xem câu hỏi thường gặp về SQL này .Điều này sẽ khiến Carbon không phân tích được dấu thời gian vì nó sẽ không mong đợi micro giây được lưu trữ. Để tránh hành vi không mong muốn này phá vỡ ứng dụng của bạn, bạn phải đặt rõ ràng độ chính xác bằng 0 cho
CURRENT_TIMESTAMP
chức năng như sau:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Kể từ Laravel 5.0,
timestamp()
các cột đã được thay đổi để sử dụng độ chính xác mặc định bằng 0, tránh được điều này.
Cảm ơn @andrewhl vì đã chỉ ra vấn đề Laravel 4.x trong các nhận xét.
Cảm ơn @ChanakaKarunarathne
để đưa ra useCurrentOnUpdate()
mới phím tắt trong nhận xét.