Laravelでcall()メソッドを使ってSeederをまとめて実行する方法!初心者でも簡単に初期データ登録
生徒
「先生、Seederを複数作ったんですけど、一つずつ実行するのって大変じゃないですか?」
先生
「確かに、一つずつ実行するのは手間ですよね。そんなときはcall()メソッドを使って、まとめてSeederを実行できます。」
生徒
「まとめて実行ってどういう仕組みですか?」
先生
「簡単に言うと、DatabaseSeederから他のSeederを呼び出して順番に実行する仕組みです。」
1. call()メソッドとは?
Laravelのcall()メソッドは、Seederクラスを呼び出して一度に実行するための便利な機能です。これを使うことで、複数のSeederをまとめて実行でき、開発やテストでの初期データ登録が非常に効率的になります。
例えば、ユーザー情報、記事情報、コメント情報など複数のテーブルにデータを入れたいとき、Seederを個別に実行するのではなく、call()を使えばまとめて処理できます。
2. DatabaseSeederでSeederをまとめる方法
Laravelではdatabase/seeders/DatabaseSeeder.phpがすべてのSeederを統括するファイルです。この中でcall()を使って個別のSeederを呼び出します。
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
UsersTableSeeder::class,
PostsTableSeeder::class,
CommentsTableSeeder::class,
]);
}
}
上記のように、配列の中に呼び出したいSeederクラスを並べるだけで、順番に実行されます。
3. Seederの作成方法の復習
Seederはターミナルで次のコマンドを実行して作成します。
php artisan make:seeder UsersTableSeeder
php artisan make:seeder PostsTableSeeder
php artisan make:seeder CommentsTableSeeder
これでそれぞれdatabase/seedersディレクトリにSeederファイルが作成されます。それぞれのrun()メソッド内にデータ登録処理を書きます。
4. 個別Seederの書き方
例えばユーザー用Seederは次のように書きます。
use Illuminate\Database\Seeder;
use App\Models\User;
class UsersTableSeeder extends Seeder
{
public function run(): void
{
User::factory()->count(5)->create();
}
}
記事用やコメント用も同様にFactoryを使ってデータを生成します。これにより、テスト用のダミーデータを簡単に準備できます。
5. call()でまとめて実行するメリット
call()を使うことで、次のようなメリットがあります。
- 複数のSeederを一括で実行できるので作業効率が上がる
- Seederの順番を指定できるため、テーブルの依存関係に対応できる
- 開発環境やテスト環境での初期データ登録が簡単になる
6. 実際にSeederを実行する方法
まとめてSeederを実行するには、次のコマンドを使用します。
php artisan db:seed
DatabaseSeederでcall()を使っている場合、このコマンドだけで複数のSeederが順番に実行されます。個別のSeederだけ実行したい場合は、--classオプションを使います。
php artisan db:seed --class=UsersTableSeeder
7. マイグレーションと組み合わせてSeederを実行
新しい環境でテーブルを作成してからSeederを実行したい場合は、migrate:freshコマンドに--seedを付けます。
php artisan migrate:fresh --seed
これでマイグレーションでテーブルを作り直し、その後DatabaseSeederを使ってまとめてデータが登録されます。
8. 開発環境での注意点
Seederのまとめ実行は便利ですが、本番環境で誤って実行すると実データが上書きされることがあります。以下の点に注意してください。
- 本番環境ではまとめてSeederを実行しない
- 開発環境と本番環境でSeederを分ける
- 必要に応じて
if文で環境を判定する