最近聽到獵人要復刊忍不住就來了點獵人梗,昨天在開 Model 的時候畢竟只是用瞬間的感覺來判斷需要哪些 Model 及 Column ,但隨著功能在真正開發的時候時常仍會發現需要更多的資料來輔助功能,這時通常還沒有將 Code commit 到 Git 上,所以可以利用 php artisan migrate
及 php artisan migrate:rollback
的方式來避免要寫很多 Migration ,但是這樣又會遇到一個問題,就是測試資料會隨著 rollback 而消失,為了避免要一直重複手動建資料的麻煩,這時就可以利用 Seeder 的功能來快速建立資料。
首先先觀察一下 database/seeders 這個資料夾,目前裡面只有 DatabaseSeeder.php 這個檔案,當使用指令 php artisan make:migrate --seed
時不僅會建立 table 也會觸發此檔案建立指定的資料,昨天建立了 Actor、Category、Characteristic、Product 共四個主要 Model ,此時幫他們建立各自的 Seeder。
php artisan make:seeder ActorSeeder
php artisan make:seeder CategorySeeder
php artisan make:seeder CharacteristicSeeder
php artisan make:seeder ProductSeeder
並在 DatabaseSeeder 加入此四個 Seeder
$this->call([
ActorSeeder::class,
CategorySeeder::class,
CharacteristicSeeder::class,
ProductSeeder::class,
);
此時還沒有結束,要進入各自的 Seeder 裡面寫當執行該 Seeder 時要做的事情
在每個 Seeder 裡面加入 {model}::factory(5)->create();
,舉例來說 ProductSeeder 就加入 Product::factory(5)->create();
,並在頂部 use 該 Model 的 namespace ,例如 Product 的就是 use App\Models\Product
。
Seeder 設定完之後就要去寫 Factory 了,Factory 是專門為了每個 Model 設定假資料的內容要寫什麼,話不多說直接上 Code。
php artisan make:factory ProductFactory
return [
'name' => $this->faker->name,
'type' => random_int(0, 1),
'outline' => $this->faker->paragraph,
];
php artisan make:factory ActorFactory
return [
'name' => $this->faker->name,
];
php artisan make:factory CategoryFactory
return [
'name' => $this->faker->title,
];
php artisan make:factory CharacteristicFactory
return [
'name' => $this->faker->colorName,
];
當這些設定全部設定好之後就可以來實際測試了,使用指令 php artisan migrate —seed
,接著到資料庫就可以看到滿滿的測試資料了。
雖說一開始會覺得建立幾筆假資料要產生這麼多個檔案實在是很麻煩,但像是 Factory 到後面寫 Feature Test 的時候也會是很好的幫手,所以無論如何還是花點時間把 Factory 寫好,要注意的是 Laravel 從 7 演進的 8 的時候 Factory 的寫法有很大的改變,如果是使用低於 8 版本的 Laravel 就要到官方網站尋找對應版本的寫法,感謝今天的收看,下集見。