Skip to main content

什麼是 Seeding

Seeding 是將範例資料或初始資料寫入資料庫的機制。 在開發環境設定或自動化測試中,通常需要事先有資料。若每次都手動輸入太耗時,用 seeder 將它整理為可反覆執行的形式。 Seeder 類別放在 database/seeders 目錄。預設會有 DatabaseSeeder 類別。

建立 Seeder

make:seeder Artisan 指令產生新的 seeder 類別。
產生的檔案會放在 database/seeders/UserSeeder.php

Seeder 的實作

run() 方法中撰寫寫入資料的處理。可用 DB facade 或 Eloquent model 插入。

使用 DB facade

使用 Eloquent model

執行 seeding 過程中,mass assignment 保護會自動停用。可不用管 $fillable$guarded 的設定就寫入資料。

與 Model Factory 的組合

若需要大量測試資料,與 model factory 組合會很方便。使用 factory 可一次產生大量隨機假資料。
Factory 的詳細用法請參閱 Eloquent factory 的文件。

DatabaseSeeder 的用法

DatabaseSeeder 是統一管理多個 seeder 的進入點。用 call() 方法指定要執行的 seeder。
Seeder 會依 call() 傳入的順序執行。若有外鍵約束,請安排先 seed 被參考的資料表(如 usersposts)。

執行 Seeder

執行全部 seeder

會呼叫 DatabaseSeeder,並依序執行以 call() 指定的 seeder。

只執行特定 seeder

--class 選項指定要執行的 seeder 類別。

與 Migration 同時執行

若在 migrate:fresh 指令加上 --seed 選項,會重建所有資料表後一併執行 seeding。
若只想執行特定 seeder,使用 --seeder 選項。
migrate:fresh 會刪除並重新建立所有資料表。既有資料全部會遺失,請勿在正式環境使用。

在正式環境執行

在正式環境嘗試執行 seeding 時會顯示確認提示。若要不確認直接執行,使用 --force 旗標。
在正式環境做 seeding 可能造成資料被覆寫或遺失。執行前務必先做備份。

抑制 Model 事件

若想避免 seeding 中觸發 model 事件(如 creatingcreated),使用 WithoutModelEvents trait。
也會套用到經由 call() 執行的子 seeder。

實務範例:部落格應用的 seeder

以下是設定使用者與文章的部落格應用初始資料的範例。
執行步驟:

後續步驟

Eloquent 入門

學習用 Eloquent ORM 取得並操作 seeder 寫入的資料。
最後修改於 2026年8月2日