3分鐘短文:一看就是乾貨!Laravel遷移資料庫!

程式設計師小助手發表於2020-10-28

引言

書接上回。我們講完了路由,又順帶講了中介軟體;接著又講了控制器,還把路由的資料發到控制器,並且渲染到檢視頁面。更深入的是,把檢視檔案的模板也說明白了。

MVC - CVM - VMC,到底缺了哪一個呢?M!

M = Model,是模型層,是與資料庫直接對接的那一層設計。我們都知道一切應用的基礎,是資料庫。資料庫也是IT工業的珠穆朗瑪峰,看當今天下,多少大中小微企業,哪個不是被資料庫卡著脖子。

所以美國要是哪天讓Oracle,Microsoft等公司限制出口資料庫產品,我們國內的資料庫能不能頂上,還未可知。

img

好了,扯得有點遠了,說說本期的要點吧。

我們本期要使用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領域原創作者

本作品採用《CC 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章