Laravel 5.3+ 自動新增建立時間與更新時間詳解
阿新 • • 發佈:2019-01-25
本文已經遷移至我的個人技術部落格:
在Laravel 5.3
之前,migrations
中的$table->timestamps()
所建立的created_at
及updated_at
兩個column
都是不允許為空的,而在5.3
開始,官方文件中寫道:
Command | Description |
---|---|
$table->timestamps(); | Adds nullable created_at and updated_at columns. |
我們可以看到,現在這兩個column
都可以為NULL
。
如果我們保留預設的migration
,那麼在更新及插入資料時,Laravel
created_at
和updated_at
兩個時間戳,即插入資料時,兩者都被更新為伺服器當前時間,更新資料時,updated_at
被更新為操作發生時間。
但是如果我們後端程式碼沒有使用Laravel
,例如我們需要使用Python
來插入一部分資料,那麼我們有兩種選擇:
- 手動生成時間並插入
- 在
migration
檔案中,調整created_at
及updated_at
的型別
第一種顯而易見,那麼我們就不多說。
第二種方法,我們將原有的$table->timestamps()
去掉,然後新增上以下程式碼:
use Illuminate\Support\Facades\DB; ... public function up() { ... $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP')); ... } ...
注意,我們需要引入DB Facade
來使用DB::raw
語句。那麼我們看到,現在created_at
以及updated_at
兩個column
被分別用timestamp()
進行宣告,我們看一下官方文件怎麼寫的:
Command | Description |
---|---|
$table->timestamp(‘added_on’); | TIMESTAMP equivalent for the database. |
可以看到,使用timestamp()
宣告的column
不能為NULL
。
那麼我們需要新增兩個column
的預設值:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
這樣一來,我們在未使用Laravel
而需要操作資料庫時,不需要主動插入時間,資料庫也會幫我們自動插入及更新時間戳。