Do đó là 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 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.
Phím tắt mới
Kể từ Laravel 5.1.25 (xem PR 10962 và cam kết 15c487fe ), bạn có thể sử dụng useCurrent()
phương thức sửa đổi cột mới để đặt CURRENT_TIMESTAMP
giá trị làm giá trị mặc định cho 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'));
Gotchas
MySQL
Bắt đầu với MySQL 5.7, 0000-00-00 00:00:00
không còn được coi là ngày hợp lệ. Như được ghi lại trong hướng dẫn nâng cấp của Laravel 5.2 , tất cả các cột dấu thời gian sẽ nhận được giá trị mặc định hợp lệ khi bạn chèn các bản ghi vào cơ sở dữ liệu của mình. Bạn có thể sử dụng công cụ useCurrent()
sửa đổi cột (từ Laravel 5.1.25 trở lên) trong quá trình di chuyển của mình để 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ạo dấu thời gian nullable()
để cho phép giá trị null.
PostgreSQL & Laravel 4.x
Trong các phiên bản Laravel 4.x, trình điều khiển PostgreSQL đã sử dụng độ chính xác của cơ sở dữ liệu mặc định để lưu trữ các giá trị dấu thời gian. Khi sử dụng CURRENT_TIMESTAMP
hàm trên một cột với độ chính xác mặc định, PostgreSQL tạo dấu thời gian với độ chính xác cao hơn có sẵn, do đó tạo dấu thời gian với phần thứ hai phân đoạn - xem câu đố SQL này .
Điều này sẽ khiến Carbon thất bại trong việc phân tích dấu thời gian vì nó sẽ không mong đợi micro giây được lưu trữ. Để tránh hành vi bất ngờ này phá vỡ ứng dụng của bạn, bạn phải cung cấp độ chính xác bằng 0 cho CURRENT_TIMESTAMP
hàm 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 điều này.
Cảm ơn @andrewhl đã chỉ ra vấn đề này trong các bình luận.
DB::statement
ví dụ của tôi , điều này đơn giản hơn nhiều.