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 被參考的資料表(如 users → posts)。

執行 Seeder

執行全部 seeder

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

只執行特定 seeder

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

與 Migration 同時執行

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

在正式環境執行

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

抑制 Model 事件

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

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

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

後續步驟

Eloquent 入門

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