[laravel8] Seeder
前回の記事でFactoryを作成した後にTinkerを使用しテストデータをデータベースのテーブルに挿入することができました。
今回はこのFactoryをコマンドから実行できるようにします。
DatabaseSeeder
あとでコマンドを実行してFactoryを実行しますが、そのコマンドが実行するファイルはseedersディレクトリの中にあるDatabaseSeeder.phpになります。
database/seeders/DatabaseSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
\App\Models\User::factory(10)->create();
}
}
このDatabaseSeederクラスのrunメソッドが実行されるわけですが、その中にあるデフォルトで記述されている
\App\Models\User::factory(10)->create();
はユーザーのfactoryを使用しているのがわかります。この場合10のユーザーのデータを作成してテーブルに挿入します。
Postデータを作成
前回の記事でPost(記事)のモデルのFactoryを以下のように作成しました。
database/factories/PostFactory.php
public function definition()
{
return [
'user_id' => User::factory,
'category_id' => Category::factory,
'title' => $this->faker->sentence,
'slug' => $this->faker->slug,
'excerpt' => $this->faker->sentence,
'body' => $this->faker->paragraph
];
}
このPostモデルのfactoryをDatabaseSeederに記述します。
database/seeders/DatabaseSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Post;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
Post::factory(5)->create();
}
}
5つの記事データを作成するようにしています。
Post::factory(5)->create();
もちろんPostFactory.phpでユーザーとカテゴリーのFactoryも実行されるので、同時にユーザーとカテゴリーも5つずつ作成されます。
コマンド
seedのコマンドは以下になります。
php artisan db:seed
注意)ただしこのコマンドは実行する度にデータが消去されるわけではないので、実行するごとにデータが蓄積されていきます。
ただ、マイグレーションのリフレッシュを行うとテーブルが空になるので、その後にseedを実行すると自動的にデータが挿入されます。
php artisan migrate:fresh
php artisan db:seed
上の2つのコマンドを一回で実行するコマンドは以下になります。
php artisan migrate:fresh --seed
コマンドを実行すると記事データが5つ、ユーザーも5つ、カテゴリーも5つ挿入されています。
データの指定
Post::factory(5)->create();
上記が実行されると、記事、ユーザー、カテゴリーがランダムに5つずつ作成されるが、データを明示的に設定できます。
例を見てみます。
User::factory()->create([
'name' => 'john'
]);
ユーザーのデータを作成するときに上記の様にnameをjohnにするよう設定することができます。
これを利用してDatabaseSeederを変更します。
database/seeders/DatabaseSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Post;
use App\Models\User;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$user = User::factory()->create([
'name' => 'john'
]);
Post::factory(5)->create([
'user_id' => $user->id
]);
}
}
名前がjohnのユーザーを作成し、
$user = User::factory()->create([
'name' => 'john'
]);
そのユーザーのIDを使い記事を5つ作成しています。
Post::factory(5)->create([
'user_id' => $user->id
]);
テーブルを確認してみると
ユーザーのテーブル
記事のテーブル
記事のuser_idには1だけが入っていますね。
最後に
今回はコマンドからテストデータを挿入できるようseedのコマンドを勉強しました。これでテーブルの構成が変わりmigrationファイルを変更するたびに手作業でデータを入力していく必要がなくなりました。
ここまでのファイルは以下になります。
この記事が気に入ったらサポートをしてみませんか?