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 就能生成假資料囉。