iT邦幫忙

2024 iThome 鐵人賽

DAY 9
1

Migration 是什麼?

一直都覺得 Migration 很神奇,只要利用程式碼就可以建立、修改資料庫裡的表,不然我都是打開 MySQL Workbench 輸入 MySQL 語法操作。
甚至是在某些不得已的時候,例如:需要更換資料庫管理系統,基本上也能快速打掉重建,並且在多人協作時,都能同步一致,拿到最新的版本。

  • 定義:使用 PHP 程式碼來建立和修改資料表及其欄位。
  • 用途:控制資料庫結構變更,易於管理和追蹤。

為什麼使用 Migration?

  • 版本控制:記錄每次資料庫變更。
  • 團隊合作:確保每個人的資料庫結構一致。
  • 自動化:部署時自動應用變更。

基本操作

  • up 方法:當 Migration 被應用時的變更。
  • down 方法:當 Migration 被 Rollback 時的變更。

發生的問題

系統規劃流程,你的食譜在哪? 文章內有說過,我一開始沒有規劃文件的習慣,當時使用 Migration 建立一個資料表後,後續發現此資料表需要額外新增其他欄位,所以自然而然想到去修改 Migration 的檔案,然後使用 artisan 指令再 migrate 一次。

php artisan migrate

本來以為會直接變更,但發現沒辦法哦!!!
菜雞仔如我,當時很慌張,結果自己去把資料表整個刪掉再重建XD(要多荒唐)

php artisan migrate:fresh

備註:這個指令真的別亂用,會刪除所有的表,當時是因為我才剛練習,沒有什麼重要的資料。

後來發現,原來已經 migrate 過的檔案,無法再直接使用 artisan 指令 migrate 一次。
需要使用 artisan 指令 rollback 後再 migrate!

php artisan migrate:rollback
php artisan migrate

這個指令會回退到最近一次的 migrate 操作,然後再 migrate,這樣剛剛想要新增的欄位就會出現了。

自訂回退

如果你想要回退到多次前的 migrate 操作,可以使用 --step 參數來指定。
例如,回退兩次:

php artisan migrate:rollback --step=2

更多關於 Migration 的資訊可以參考以下文章:


小食譜03:資料庫設計

我在 設定 .env 檔案 這篇文章裡,已經有先建立好 product 資料庫,並且設定好 .env 檔案連結此資料庫。

昨天在 Laravel 專案中建立一個名為 Product 的 Model,並同時「載入預設CRUD方法」建立以下檔案:

  • Migration
  • Controller

這裡我的步驟是:在打開 Migration 前,先規劃好我的資料表!
盡可能將需要的情況都設想好,但如果真的之後需要補什麼,後續再補即可。

資料表規劃:products 表

欄位名 說明 格式 包含備註內容
id ID unsignedBigInteger 自動遞增
type_id 產品分類 unsignedBigInteger foreign 外鍵關聯 接受空值 預設值為空
product_name 產品名稱 varchar(255)
product_description 產品描述 text
price 產品價錢 unsignedInteger
created_at 新建時間 timestamp
updated_at 更新時間 timestamp

資料表規劃:types 表

欄位名 說明 格式 包含備註內容
id ID unsignedBigInteger
name 類別名稱 varchar(255)
sort 排序 integer 預設值100
created_at 新建時間 timestamp
updated_at 更新時間 timestamp

資料表規劃:users 表

欄位名 說明 格式 包含備註內容
id ID unsignedBigInteger
name 會員名稱 varchar(255)
email 電子郵件 varchar(255) 唯一值
email_verified_at 驗證時間 timestamp 接受空值
password 會員密碼 varchar(255)
permission 會員權限 integer 預設一般會員
created_at 新建時間 timestamp
updated_at 更新時間 timestamp

使用 unsignedBigInteger & unsignedInteger

unsignedInteger 適合存較小範圍的整數,而 unsignedBigInteger 適合需要存更大數值的情況。確保 type_id 跟 price 不會是負數且沒有小數點。

動手做做看

規劃好資料表後,打開昨天同時建立的 Migration 檔案:create_products_table.php
這裡的 type_id 一開始先不做「包含備註內容」的部份,等到後續新增 types 表時再做。

輸入程式碼:

public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('type_id')->comment('產品類別');
            $table->string('product_name')->comment('產品名稱');
            $table->text('product_description')->comment('產品描述');
            $table->unsignedInteger('price')->comment('產品價錢');
            $table->timestamps();
        });
    }

備註:

$table->id();
  • 會自動設定 id 欄位為 unsignedBigInteger。
  • 會設定為主鍵。
  • 會設定為自動遞增。

接著使用 artisan 指令

php artisan migrate

查看資料庫是否已確實出現表格及所需結構

打開 MySQL Workbench

輸入指令:

SHOW TABLES;

確認有出現 products 表後,再輸入以下指令檢查資料表結構:

DESCRIBE `products`;

確認好剛才設定的欄位格式都有出現!


上一篇
Laravel 的 MVC 架構設計模式
下一篇
Controller & Route:來指派店長跟分配店員吧!
系列文
後端菜雞仔想學 Laravel13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言