引言
書接上回。我們講完了路由,又順帶講了中間件;接着又講了控制器,還把路由的資料發到控制器,并且渲染到視圖頁面。更深入的是,把視圖檔案的模闆也說明白了。
MVC - CVM - VMC,到底缺了哪一個呢?M!
M = Model,是模型層,是與資料庫直接對接的那一層設計。我們都知道一切應用的基礎,是資料庫。資料庫也是IT工業的珠穆朗瑪峰,看當今天下,多少大中小微企業,哪個不是被資料庫卡着脖子。
是以美國要是哪天讓Oracle,Microsoft等公司限制出口資料庫産品,我們國内的資料庫能不能頂上,還未可知。

好了,扯得有點遠了,說說本期的要點吧。
我們本期要使用laravel自帶的遷移功能,在不操作任何資料庫的條件下,完成基礎的資料建構。
遷移檔案
本文假設你已經正确地配置了環境變量檔案,并且通過資料庫配置項,系統已經可以正常連接配接到資料庫了。
在項目檔案裡,不出意外你會在目錄 database/migrations 下發現 2014_10_12_000000_create_users_table.php 檔案,
這個是laravel自帶的用于建立 users 表的遷移檔案。隻要是實作了兩個方法,一個是 up 用于執行指令,一個是 down 用于復原操作。
來看一下初始的内容,首先是 up 方法:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
});
}
我們主要關心的是字段的資料類型,以及預設值限制,唯一性限制等等。而字段類型也做的很直覺,string 對應 varchar 類型。
比如主鍵預設的自增 id,還有用于記錄建立時間 created_at 和 更新時間 updated_at,一個 timestamps() 方法就包含了,
隻不過預設使用的是不直覺的整型時間戳,如果要使用 datetime 格式用于直覺地讀取,則可以手動聲明:
$table->dateTime('created_at')->comment('建立時間');
$table->dateTime('updated_at')->comment('更新時間');
與建立表方法對應的是復原時候的删除表,下面是預設的 down 方法:
public function down()
{
Schema::drop('users');
}
其實這個寫法有點不保險,如果 users 表不存在的話,我們并不需要執行這條指令。是以,可以完善性地添加一個存在條件判斷:
Schema::dropIfExists('users');
這樣生成的就是類似下面的額 SQL 語句:
DROP TABLE IF EXISTS databse_name.users;
遷移檔案準備完畢,要将該功能應用起來,隻需在指令行輸入:
php artisan migrate
系統就會執行遷移檔案内的内容,并組裝好SQL語句發送給資料庫執行。
自力更生
那麼,上面的是系統自帶的遷移檔案,開發者如何自己手動生成呢?其實laravel提供了齊備的指令行腳手架,
下面的方法都可以用于建立一個遷移檔案:
php artisan make:migration create_users_table
php artisan make:migration add_votes_to_users_table --table=users
php artisan make:migration create_users_table --create=users
第一個僅僅指定了遷移檔案名稱,一般我們給它起一個直覺的名字,友善給自己和維護者提個醒 :-)
第二個使用了 --table 選項指定該遷移檔案是對哪個表起作用的。
第三個使用了 --create 選項,這樣不僅建立了遷移檔案,還順帶着把模型給建好了,一石二鳥!
建立新表沒啥好說的,字段類型一定要選好,如果寫好了,又進行了遷移,資料庫也生效了,這時候,半路上要修改字段類型,
最好資料庫裡沒資料,要是有,可就要遭殃,比如說原本是 varchar(50),有的字段寫滿了50個字元,現在要修改為 varchar(20),
資料庫是不允許的。
可以向上擴充,向下,對不起,資料庫說 NO!怎麼辦?隻能手動處理資料到合适的長度再做修改。
而在 laravel 裡對一個空表修改字段,完全可以通過,我們建立新的遷移檔案,然後在 up 方法内這樣調用:
$table->string('name', 100)->change();
看,隻用調用一個 change 方法,就搞定了。這個方法最終使用的是類似下面的SQL語句:
alter table `users` alter `name` varchar(100);
當然還可以對字段的預設值限制進行修改:
$table->string('deleted_at')->nullable()->change();
對于插入新的字段,還可以指定位于哪個字段之前或者之後:
$table->string('email')->nullable()->after('last_name');
僅僅修改字段名,隻需調用對應方法:
$table->renameColumn('promoted', 'is_promoted');
或者在復原方法中對某些新增的字段進行删除:
$table->dropColumn('votes');
常用的限制比如主鍵限制,聯合主鍵限制,唯一性限制,和索引限制。也可以很友善地在聲明表,或者修改表的時候進行調用:
$table->primary('primary_id'); // 指定主鍵
$table->primary(['first_name', 'last_name']); // 聯合主鍵
還有唯一性限制,為存在的字段建立:
$table->unique('email'); // 唯一性
$table->unique('email', 'optional_custom_index_name'); // 指定索引名
為字段建立索引:
$table->index('amount'); // 索引
$table->index('amount', 'optional_custom_index_name'); // 指定索引名
過于複雜的資料庫方面的限制,觸發器,存儲過程,事務等等,是我們所不提倡的,因為溯源有些困難。上面給的這些個方法,足夠應對很多很多場景了。
寫在最後
本文介紹了laravel中使用遷移功能操作資料庫的建立,修改,移除字段,删除表等,把開發者從手動維護資料庫的狀态中解脫出來。這樣也為團隊協作時的有章可循做了鋪墊。
成熟的開發團隊,應該有規範的制度,特别是底層的資料庫結構,大家限制在程式設計層面,友善使用代碼庫管控和全程追溯。這非常值得推薦。
Happy coding :-)
我是 @程式員小助手 ,專注程式設計知識,圈子動态的IT領域原創作者