D9 - 走進 Laravel 的世界,從 Migration 開始

更新 發佈閱讀 20 分鐘

哈囉,大家好!經過前面的努力,我們已經為個人財務管理系統設計了完整的資料庫結構。現在,是時候將這些設計實際落地到 Laravel 框架中了。

今天,我們要一起探索 Laravel 中非常重要的一環:Migration(資料庫遷移)。

相信我,掌握了 Migration,不僅能讓你更有效地管理資料庫,還能讓你在開發過程中更加游刃有餘。讓我們一起揭開 Migration 的神秘面紗吧!


一、什麼是 Laravel 的 Migration?

Migration 是 Laravel 提供的一種資料庫管理工具,它讓你可以用程式碼的方式定義和修改資料庫結構。簡單來說,Migration 就像是資料庫的版本控制,讓你可以方便地同步團隊之間的資料庫變更。


為什麼要使用 Migration?

  • 版本控制:像 Git 一樣,Migration 讓你可以追蹤資料庫的變化,方便團隊協作。
  • 自動化:透過指令即可執行資料庫的建立、更新,減少手動操作的錯誤風險。
  • 可移植性:輕鬆在不同的環境中同步資料庫結構,如開發、測試、正式環境。

個人經驗分享:還記得剛開始開發時,手動修改資料庫結構總是帶來各種麻煩。自從使用了 Migration,一切變得有條不紊,在開發上也更加順暢。



二、開始使用 Migration

1. 建立 Migration 檔案

Laravel 提供了 Artisan CLI(命令列介面)來幫助我們生成 Migration 檔案。讓我們來為 users 表建立一個 Migration。

在終端機中進入專案的根目錄,執行以下指令:等等……你有發現 database/migrations 目錄下,已經有一個 create_users_table.php 檔案嗎?這個檔案就是預設的 users 資料表結構:

/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});

Schema::create('password_reset_tokens', function (Blueprint $table) {
$table->string('email')->primary();
$table->string('token');
$table->timestamp('created_at')->nullable();
});

Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('users');
Schema::dropIfExists('password_reset_tokens');
Schema::dropIfExists('sessions');
}

這比我們預先規劃的多了兩張表,而且 users 的結構有幾個地方不一樣。所以在我們開始編輯 Migration 檔案前,先來介紹 Schema Builder 的相關用法。

2. Schema Builder 的基本用法

Laravel 的 Schema Builder 是一個強大的工具,讓你可以使用 PHP 語法來定義資料庫的結構,而不需要直接撰寫 SQL 語句。這使得程式碼更具可讀性,也更容易維護。

以下是一些常用的 Schema Builder 方法,以及它們對應的 MySQL 資料型態:

  • $table->bigIncrements('id'):建立一個自增的 BIGINT 主鍵欄位,等同於 MySQL 的 BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY。
  • $table->string('username', 50)->unique():建立一個長度為 50 的 VARCHAR 欄位,並設定唯一索引。
  • $table->string('password'):建立一個字串欄位,用於儲存加密後的密碼,等同於 MySQL 的 VARCHAR(255)。
  • $table->timestamps():自動建立 created_at 和 updated_at 兩個時間戳記欄位。
  • $table->text('description'):建立一個 TEXT 欄位,適合儲存大量文字。
  • $table->decimal('amount', 8, 2):建立一個 DECIMAL 欄位,總長度為 8 位,包含 2 位小數。
  • $table->boolean('is_active'):建立一個 BOOLEAN 欄位,儲存布林值。
  • $table->date('transaction_date'):建立一個 DATE 欄位,用於儲存日期。
  • $table->enum('type', ['income', 'expense']):建立一個 ENUM 枚舉欄位,限定值為 'income' 或 'expense'。
  • $table->foreignId('user_id')->constrained('users'):建立一個外鍵欄位,參照 users 表的 id 欄位。
  • $table->unique('email'):為 email 欄位建立唯一索引。
    MySQL 資料型態對照
  • $table->string():VARCHAR
  • $table->text():TEXT
  • $table->integer():INT
  • $table->bigInteger():BIGINT
  • $table->decimal():DECIMAL
  • $table->boolean():TINYINT(1)
  • $table->date():DATE
  • $table->dateTime():DATETIME

小提醒:Laravel 的 Schema Builder 提供了許多方便的方法,詳細可以參考官方文件,多加了解絕對不會吃虧!

3. 編寫 Migration 檔案

打開預設的 create_users_table.php 檔案,你會看到 up 和 down 兩個方法。

  • up 方法:定義在執行 Migration 時要做的事情,例如建立資料表。
  • down 方法:定義在回滾 Migration 時要做的事情,例如刪除資料表。
    現在,讓我們修改 up 方法,使其符合我們的需求:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('username', 50)->unique();
$table->string('email', 100)->unique();
$table->string('password');
$table->timestamps();
});
}

在這裡,我們使用了 Laravel 的 Schema Builder 來定義資料表的結構,並移除了我們不需要的欄位。

寫下來我們所執行的指令都是在Laravel 容器內執行,如果忘記怎麼進入容器的終端環境,請回去參考D5喔

三、為其他資料表建立 Migration

接下來,按照同樣的步驟,為其他資料表建立 Migration。

1. 建立 bank_accounts 表的 Migration

執行指令:

php artisan make:migration create_bank_accounts_table --create=bank_accounts

編輯生成的 Migration 檔案:

public function up()
{
Schema::create('bank_accounts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('account_name', 100);
$table->string('account_number', 50)->nullable();
$table->string('bank_name', 100)->nullable();
$table->decimal('balance', 15, 2)->default(0.00);
$table->timestamps();

// 外鍵約束
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}

2. 建立 categories 表的 Migration

執行指令:

php artisan make:migration create_categories_table --create=categories

編輯生成的 Migration 檔案:

public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('category_name', 100);
$table->enum('type', ['income', 'expense']);
$table->timestamps();

// 外鍵約束
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}

3. 建立 transactions 表的 Migration

執行指令:

php artisan make:migration create_transactions_table --create=transactions

編輯生成的 Migration 檔案:

public function up()
{
Schema::create('transactions', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('bank_account_id');
$table->unsignedBigInteger('category_id');
$table->enum('type', ['income', 'expense']);
$table->decimal('amount', 15, 2);
$table->date('transaction_date');
$table->string('description', 255)->nullable();
$table->timestamps();

// 外鍵約束
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('bank_account_id')->references('id')->on('bank_accounts')->onDelete('cascade');
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
});
}

四、執行 Migration

所有 Migration 檔案都準備好了,現在讓我們來執行它們,實際建立資料表。

在終端機中執行:

php artisan migrate

如果一切順利,終端機會顯示 Migration 已成功執行。

個人經驗分享:有時候執行 Migration 時會遇到錯誤,通常是因為資料表之間的關聯順序問題。例如,transactions 表需要 users、bank_accounts 和 categories 表已經存在。所以在編寫 Migration 時,注意資料表的建立順序很重要。

解決關聯順序問題

為了確保 Migration 按照正確的順序執行,可以在 Migration 檔案的開頭加上時間戳,使其按照時間順序排列。


例如,在 Migration 檔案名稱前面添加時間戳:


  • 2024_09_22_100000_create_users_table.php
  • 2024_09_22_101000_create_bank_accounts_table.php
  • 2024_09_22_102000_create_categories_table.php
  • 2024_09_22_103000_create_transactions_table.php
    這樣,Laravel 會按照時間順序執行 Migration,避免外鍵約束的問題。

五、Rollback 與修改 Migration

1. rollback Migration

如果發現 Migration 有錯誤,需要回滾,執行:

php artisan migrate:rollback

這會回滾最近一次的 Migration。

2. 修改 Migration

在開發階段,你可能需要修改已經建立的 Migration。常見的做法是:

  1. rollback Migration:
php artisan migrate:rollback
  1. 修改 Migration 檔案。
  2. 重新執行 Migration:
php artisan migrate

小提醒:在正式環境中,不建議直接修改已經執行的 Migration,而是應該建立新的 Migration 來修改資料表結構。

六、填充測試資料(Seeder)

為了測試,我們可以使用 Laravel 的 Seeder 來填充一些測試資料。

1. 建立 Seeder

執行指令:

php artisan make:seeder UsersTableSeeder

這會在 database/seeders 目錄下生成一個 UsersTableSeeder.php 檔案。

2. 編寫 Seeder

打開 UsersTableSeeder.php,填寫以下內容:

public function run()
{
User::factory()->create([
'username' => 'testuser',
'email' => 'test@example.com',
'password' => bcrypt('password'),
'created_at' => now(),
'updated_at' => now(),
]);
}

3. 執行 Seeder

在 DatabaseSeeder.php 中,呼叫剛剛建立的 Seeder:

public function run()
{
$this->call(UsersTableSeeder::class);
}

執行 Seeder:

php artisan db:seed

這樣,我們就為 users 表填充了一筆測試資料。

小結

今天,我們深入了解了 Laravel 的 Migration,並實際建立了我們之前設計的資料表。透過 Migration,我們可以:

  • 方便地管理資料庫結構:所有的資料表定義都在程式碼中,可追溯、可版本控制。
  • 團隊協作更順暢:團隊成員之間的資料庫變更可以透過版本控制系統同步。
  • 自動化部署:在部署到不同環境時,只需執行 Migration,就能確保資料庫結構一致。

個人經驗分享:一開始接觸 Migration 時,可能會覺得多此一舉,但當你經歷過手動修改資料庫帶來的痛苦後,你就會發現 Migration 是多麼的可靠和方便。

Next

在完成資料表的建立後,接下來我們將:建立模型(Models),與資料表進行互動!

留言
avatar-img
詹姆士的軟體易開罐
34會員
93內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/14
哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。 現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。 透過這次的實作,我們將學習如何在 N
Thumbnail
2024/12/14
哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。 現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。 透過這次的實作,我們將學習如何在 N
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
本文介紹了如何在 Laravel 中實作控制器,為個人財務管理系統建立完整的 CRUD API。我們實現了資料的建立、查詢、更新和刪除,並使用資料驗證提升應用安全性。未來將進行程式碼重構及 API 測試,持續優化應用程式。
Thumbnail
本文介紹了如何在 Laravel 中實作控制器,為個人財務管理系統建立完整的 CRUD API。我們實現了資料的建立、查詢、更新和刪除,並使用資料驗證提升應用安全性。未來將進行程式碼重構及 API 測試,持續優化應用程式。
Thumbnail
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
Thumbnail
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
Thumbnail
這篇文章深入探討了開發個人財務管理系統的規劃過程,包括需求確認、環境建置及技術選型等關鍵步驟。作者強調在開發前進行充分的規劃與設計是成功的基礎,並提供了具體的工具與技術選擇,如PHP、Laravel和Docker。通過清晰的步驟指引,文章幫助讀者掌握系統開發的核心要素,確保順利推進專案。
Thumbnail
這篇文章深入探討了開發個人財務管理系統的規劃過程,包括需求確認、環境建置及技術選型等關鍵步驟。作者強調在開發前進行充分的規劃與設計是成功的基礎,並提供了具體的工具與技術選擇,如PHP、Laravel和Docker。通過清晰的步驟指引,文章幫助讀者掌握系統開發的核心要素,確保順利推進專案。
Thumbnail
每個人當熟悉某些工作內容後,通常會發展出一套更有效率的作法。在會計處理上,也是如此,其中工作底稿正是統整試算、調整與編表的完美工具。
Thumbnail
每個人當熟悉某些工作內容後,通常會發展出一套更有效率的作法。在會計處理上,也是如此,其中工作底稿正是統整試算、調整與編表的完美工具。
Thumbnail
今年申報系統也有提供CSV檔操作的使用者手冊,在系統的中的G6.3,如有需要也可以透過申報系統中的功能下載 接下來我們來介紹操作流程: 1.下載範例檔案:選擇G6.2 CSV建檔範例下載 點選後系統會連線到財政資訊中心,選擇您要下載的範例檔案 下載後選取檔案開啟
Thumbnail
今年申報系統也有提供CSV檔操作的使用者手冊,在系統的中的G6.3,如有需要也可以透過申報系統中的功能下載 接下來我們來介紹操作流程: 1.下載範例檔案:選擇G6.2 CSV建檔範例下載 點選後系統會連線到財政資訊中心,選擇您要下載的範例檔案 下載後選取檔案開啟
Thumbnail
寫在前面:如果您是透過會計系統產生申報媒體檔案的,可以跳過這一篇,直接進行:A.7網路申報上傳 上一篇有提到,各類所得申報的最基本的資料內容,需要包含: 1.申報單位資料 2.單位內的所得人(公司付錢的對象)資料 3.給付的所得項目(EX:薪資)、金額 點選進入後,我們可以看到資料建置畫面;
Thumbnail
寫在前面:如果您是透過會計系統產生申報媒體檔案的,可以跳過這一篇,直接進行:A.7網路申報上傳 上一篇有提到,各類所得申報的最基本的資料內容,需要包含: 1.申報單位資料 2.單位內的所得人(公司付錢的對象)資料 3.給付的所得項目(EX:薪資)、金額 點選進入後,我們可以看到資料建置畫面;
Thumbnail
目前有提供使用Excel試算表編輯檔案,透過編輯該檔案,再將資料匯入到申報系統中進行資料核對與申報作業 步驟為: 1.下載範例檔 2.編輯後將範例檔另存為CSV格式 3.透過系統將檔案轉換為新U8格式 4.匯入轉換後的檔案
Thumbnail
目前有提供使用Excel試算表編輯檔案,透過編輯該檔案,再將資料匯入到申報系統中進行資料核對與申報作業 步驟為: 1.下載範例檔 2.編輯後將範例檔另存為CSV格式 3.透過系統將檔案轉換為新U8格式 4.匯入轉換後的檔案
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News