使用laravel的數據庫遷移功能進行表的創建,和遷移回滾之后,我們繼續說說在設計中 表結構的更改之后的處理。以及如何為數據庫填充一些偽數據作為測試。
數據約束
上一章說到數據庫遷移回滾,可以手動控制回滾到哪一批次的遷移位置。比如我們創建的 events 表, 如果在遷移文件內添加字段,代碼如下:
我們在數據庫表中間的位置添加了一個 venue 字段。然后使用遷移指令
php artisan migrate
就可以應用這些改變了。
很多時候,并不是說我們創建了表,并且指定了字段名,和字段數據類型就算完事兒了。 我們需要空與非空約束,默認值約束,主鍵約束,外鍵約束等等數據庫所具有的特性, 這才是關系型數據庫的魅力。
比如聲明一個布爾類型的值,并聲明默認為false:
$table->boolean('confirmed')->default(false);
比如設定一個字符串類型的字段,允許為null:
$table->string('comments')->nullable();
比如設定整型為無符號數:
$table->tinyInteger('age')->unsigned();
在給上面的 age 字段設定默認值:
$table->tinyInteger('age')->unsigned()->default(0);
增刪字段
使用遷移功能增刪數據庫表的字段,與之前講的創建遷移文件相同, 首先創建一個遷移文件,使用以下腳手架指令:
php artisan make:migration add_enabled_to_events_table --table=events
本遷移文件我們要為表 events 添加一個 enabled 的布爾類型的字段。上述指令輸出內容如下:
Created Migration: 2020_09_28_213116_add_enabled_to_events_table
現在為該遷移文件添加 up & down 方法,指定遷移開始和回滾所要執行的動作, 我們僅僅是添加一個字段,或者在回滾的時候,刪除一個字段,代碼如下圖:
完成后在命令行執行遷移指令:
php artisan migrate
輸出結果如下:
Migrating: 2020_09_28_213116_add_enabled_to_events_table
Migrated: 2020_09_28_213116_add_enabled_to_events_table
上面我們并沒有指定添加的字段在哪個字段的后面,所以laravel所組裝的SQL就默認是最后一個字段之后。 大家應該不陌生SQL語句追加字段的語法:
ALTER TABLE contacts ADD last_name varchar(40) NOT NULL AFTER contact_id;
laravel的遷移指令也允許我們指定某個追加的字段位于某個列之后:
$table->boolean('enabled')->after('name');
遷移狀態
查看當前數據庫的遷移狀態,會讓我們查看創建的遷移文件中哪些被應用了, 哪些還沒有被應用,這樣在數據庫表比較多的情況下,可以有效地排查問題。
laravel提供了腳手架命令:
php artisan migrate:status
輸出內容類似下圖:
還有兩個高危指令,一個是 magrate:reset 回滾所有的遷移,不同于 migrate:rollback 僅回滾某一批次的遷移; 還有一個是 migrate:refresh,如果你修改了某些遷移過的文件,這個指令會刷新所有修改的變更并應用。
這兩個都要慎用!
寫在最后
本文是對上一章所述laravel數據庫遷移功能的補充。數據庫遷移是一個比較大的動作, 特別是已經上線生產的應用數據庫,如果非到更新遷移的地步不可,需要預期做好演練, 以應對可能的突發事故。