Laravel 5.3+ 自動添加創建時間與更新時間詳解

注意:文章內容建立在Migrations之上,如果你對Migration不熟悉,可以先參考 Laravel數據庫遷移(Database Migration)操作實例

Laravel 5.3之前,migrations中的$table->timestamps()所創建的created_atupdated_at兩個column都是不允許爲空的,而在5.3開始,官方文檔中寫道:

Command Description
$table->timestamps(); Adds nullable created_at and updated_at columns.

我們可以看到,現在這兩個column都可以爲NULL

如果我們保留默認的migration,那麼在更新及插入數據時,Laravel會自動幫我們處理好created_atupdated_at兩個時間戳,即插入數據時,兩者都被更新爲服務器當前時間,更新數據時,updated_at被更新爲操作發生時間。

但是如果我們後端代碼沒有使用Laravel,例如我們需要使用Python來插入一部分數據,那麼我們有兩種選擇:
1. 手動生成時間並插入
2. 在migration文件中,調整created_atupdated_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而需要操作數據庫時,不需要主動插入時間,數據庫也會幫我們自動插入及更新時間戳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章