Seeder 是建立假資料的區塊,與 Migration 一樣只要定義好規則,一個指令就可以生成假資料
檔案在 Migration 章節應該就建立好了,如果沒有的話就用以下指令(StoreSeeder
為檔名)
php artisan make:seeder StoreSeeder
在 Seeder 檔案中你會看到孤單的一個run()
,很明顯這就是定義規則的區塊,那如何定義呢?
//引入
use \\App\\Models\\Store;
public function run()
{
Store::create([
'name' => "無名",
'address' => "台灣大道二段二號",
]);
}
接下來使用下列指令就可以生成假資料囉
php artisan db:seed --class=StoreSeeder
可能已經有人看出來了,這就是 laravel 內建 ORM 的新增資料方式,這也就是最簡單的假資料建立方法,但是我要的是隨機產生的假資料怎麼辦呢,這時候就要用到 factory 了,這是一個使用了一個PHP套件 — faker,所定義隨機資料產生的地方。
當然檔案也應該生成了,沒有的話請使用下列指令(StoreFactory
為檔名)
php artisan make:factory StoreFactory
factory的檔案也很簡單,在definition
函式中已經有return[];
,只要定義這個回傳的陣列即可。
// StoreFactory.php
return [
'name' => $this->faker->company(),
'address' => $this->faker->address(),
'description' => $this->faker->realTextBetween(50, 100),
];
在陣列裡一樣使用 key => value 方式,並且 key 值對應欄位名稱。
不同的是 $this->faker->
,這裡使用 faker 生成假資料,該套件有非常多不同的資料格式可以選擇,上面的範例依序是選擇了公司名稱、地址、50~100字的有意義文字。
然後將 Seeder 修改一下
//引入 Model
use \\App\\Models\\Store;
public function run()
{
Store::factory()->count(10)->create();
}
再跑一次指令試試看,有沒有成功呢?成功的話 ProductSeeder 也試試看
//ProductFactory.php
return [
'name' => $this->faker->unique()->word(),
'price' => $this->faker->randomNumber(4, false),
'description' => $this->faker->realTextBetween(50, 100),
'store_id' => \\App\\Models\\Store::all('id')->random()
];
//ProductSeeder.php
//引入 Model
use \\App\\Models\\Product;
public function run()
{
Product::factory()->count(30)->create();
}
Product 因為還寫了連外建,所以用了\\App\\Models\\Store::all('id')->random()->id
來隨機產生id
接下來輸入php artisan db:seed --class=ProductSeeder
就能生成假資料囉。