バージョン:Laravel 6.20.32
FactoryとSeederを使って一度に複数テーブルにダミーデータを投入する。
Factoryでfakerを使ってランダムにダミーデータ生成、Seederでそれを実行。
さらにそれをDatabaseSeederでループして実行。
ordersテーブルとorders_detailsテーブルの2つのテーブルに対して、一度にダミーデータを入れてみる。
FactoryとSeederの用意
ordersテーブル
OrderFactory.php
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\Models\Order;
use Faker\Generator as Faker;
$factory->define(Order::class, function (Faker $faker) {
return [
'order_name01' => $faker->lastName,
'order_name02' => $faker->firstName,
...
];
});
OrderSeeder.php
<?php
use Illuminate\Database\Seeder;
class OrderSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(App\Models\Order::class, 1)->create();
}
}
order_detailsテーブル
OrderDetailFactory.php
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\Models\OrderDetail;
use App\Models\Order;
use Faker\Generator as Faker;
$factory->define(OrderDetail::class, function (Faker $faker) {
return [
'order_id' => Order::max('id'), // ordersテーブルのidの最大値
'product_id' => $faker->numberBetween(1,5),
...
];
});
OrderDetailSeeder.php
<?php
use Illuminate\Database\Seeder;
class OrderDetailSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(App\Models\OrderDetail::class, 2)->create();
}
}
OrderDetailSeeder.phpに関しては2回実行としているので、ordersテーブルの1レコードあたり、order_detailsテーブルには2レコード作成される。
DatabaseSeeder.phpの記述
DatabaseSeederにて、makeOrderというメソッドを作り、それを50回実行するようにする。
makeOrderメソッドでは、OrdesSeederとOrderDetailSeederを呼び出す。
結果、ordersテーブルには50レコード、order_detailsテーブルには100レコード作成される。
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the order relation database.
*
* @return void
*/
public function makeOrder(int $count){
for ($i = 0; $i < $count; $i++){
$this->call([
OrderSeeder::class,
OrderDetailSeeder::class,
]);
}
return;
}
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->makeOrder(50);
}
}
Seederの実行
artisanコマンドでDatabaseSeederを実行。
php artisan db:seed