LaravelのSeederで使う「$this->call()」とは?使い方と仕組みをやさしく解説!

はじめに

Laravelでアプリを作っていると、初期データを登録するために「Seeder(シーダー)」を使う場面が出てきますよね。
特にプロジェクトが大きくなると、Seederの数もどんどん増えてきます。

そんなときに活躍するのが $this->call() というメソッド。
「これって何?」「なんで必要なの?」と疑問に思う方も多いのではないでしょうか。

今回は、この $this->call() の意味と使い方を、初心者向けにやさしく解説します!


やりたいこと

  1. $this->call() の意味と役割を理解する

  2. 複数のSeederをまとめて実行する方法を知る

  3. ソースコードレベルでの動作も軽く把握する


ディレクトリ構成

LaravelではSeederファイルは基本的に以下の場所に保存されます。

database/
└── seeders/
├── DatabaseSeeder.php ←ここで $this->call() を使う
├── RoleSeeder.php
├── DepartmentsMasterSeeder.php
└── ...

コードスクリプト

コードスクリプトの概要

以下のように、Laravelの DatabaseSeeder.php$this->call() を使って複数のSeederをまとめて呼び出します。

public function run(): void
{
$this->call([
RoleSeeder::class,
DepartmentsMasterSeeder::class,
ProjectCategorySeeder::class,
]);
}

これで、php artisan db:seed を実行するだけで上記3つのSeederが順番に実行されます。


実行結果

コマンドはいつも通り、以下でOKです。

bash
php artisan db:seed

すると以下のように複数のSeederが順番に実行されます。

bash
Seeding: RoleSeeder
Seeding: DepartmentsMasterSeeder
Seeding: ProjectCategorySeeder
Database seeding completed successfully.

コード解説

$this->call() の意味

これは Laravelが用意している Seederの実行専用メソッド です。
引数に渡したSeederクラス(::class)の run() メソッドを自動的に呼び出してくれます。

$this->call([
RoleSeeder::class,
DepartmentsMasterSeeder::class,
]);

上記のように配列で渡せば、複数Seederを一括で実行可能です。

✅ ::class って何?

PHPの ::class は、クラス名の「文字列」を返す構文です。
例えば RoleSeeder::class は、実際には "App\\Database\\Seeders\\RoleSeeder" という文字列になります。

✅ Laravel内部ではどう動いてるの?

Laravelの Seeder クラス(Illuminate\Database\Seeder)には、以下のように call() が定義されています。

public function call($class, array $parameters = [])
{
$classes = Arr::wrap($class);

foreach ($classes as $class) {
$this->resolve($class)->__invoke();
}
}

注意点

  • クラス名とファイル名は一致させましょう(例:RoleSeeder クラスは RoleSeeder.php

  • Seeder間に依存関係がある場合は順番に注意


🔗 Laravel公式ドキュメントにも記載あり!

今回紹介した $this->call() は、Laravelの公式ドキュメントにも記載されています。
さらに詳しく知りたい方は、ぜひこちらもチェックしてみてください。

👉 Seeding – Laravel 公式ドキュメント


まとめ

Laravelでデータベースに初期データを入れるとき、Seederの数が増えてくると管理が大変になります。
そんなときに $this->call() を使えば、1箇所で複数のSeederを順序通りに実行できるので非常に便利です。

Laravel標準の仕組みなので、安心して使ってOK!
ぜひあなたのプロジェクトでも活用してみてくださいね。

コメント

タイトルとURLをコピーしました