この記事にはプロモーションが含まれています。

【Laravel11】シーダとファクトリでテストデータを一括作成する方法

【Laravel11】シーダとファクトリでテストデータを一括作成する方法

Webアプリ開発をするときは、実際の画面表示やデータ処理の動きなどを確認するためにテストデータを作成する必要があります。

テストデータは手作業で入力していっても問題ありませんが、それではあまりに非効率です。

そこで今回は、Laravel11

シーダとファクトリを用いて
テストデータを自動で一括作成する方法

をご紹介します。

この記事を読むとわかること
  • Laravel11でテストデータを自動で一括作成する方法
  • シーダとファクトリとは?
ケケンタ

シーダとファクトリを活用するといつでも簡単にテストデータの登作成できるようになるため、効率的なアプリ開発が可能になります!

おすすめ記事



Amazon Audible(オーディブル)キャンペーンバナー


ケケンタ

ケケンタのITブログでは、WebアプリPHPLaravel)やWeb制作WordPressコーディング)について情報を発信しています。
学習中の方や実務をされている方など多くの方にアクセスいただいていますので、ぜひほかの記事も参考にしてみてください!





目次

シーダとファクトリ

Laravelにはテストデータを自動作成する仕組みとして「シーダ」と「ファクトリ」の2つが用意されています。

まずは、これら2つについて簡単に解説をします。

シーダ(Seeder)とは?

シーダ(Seeder)とは、英語で「種をまく人」という意味です。

文字通りデータベースに種(テストデータ)をまくというイメージです。

シーダーを用意することで、コマンドを打つだけでテストデータを簡単に追加可能です。

シーダだけでもテストデータを自動追加することは可能です。
ただし、その場合は「テストデータひとつにつき、コマンドを1回実行する必要がある」ため、非常に手間がかかります。
※このあとご紹介するファクトリと組み合わせて使用することで、複数のデータを一括作成することが可能です。

公式ドキュメント(日本語):シーディング
https://readouble.com/laravel/11.x/ja/seeding.html

ファクトリ(Factory)とは?

ファクトリ(Factory)は、データベースにテストデータを追加する際、各カラムのデフォルト値を自動設定するための仕組みです。

前節でご紹介したシーダと組み合わせることで、下記のような実装ができます。

  • シーダ   → モデルインスタンスを生成 + データベースへ追加
  • ファクトリ → シーダーで生成されたモデルインスタンスにデフォルト値を設定

シーダとファクトリを組み合わせることで複数のテストデータを一括作成できる

公式ドキュメント(日本語):ファクトリ
https://readouble.com/laravel/11.x/ja/eloquent-factories.html

【手順】シーダとファクトリでテストデータを一括作成する

本章では、シーダとファクトリを利用して、実際に複数のテストデータを一括作成する手順を解説します。

ケケンタ

大まかな手順は以下のとおりです!

なお、解説をするにあたっては、以下のテーブル構造を持ったTODOアプリを例に用います。

(例)TODOアプリのテーブル構造

カラム名説明
titleタスクのタイトル
statusタスクの状態(1: 未着手、2:着手中、3:完了)
due_dateタスクの期限
TODOアプリのテーブル構造

実際に手を動かしたい方は、上記構造のTaskモデルtasksテーブルを事前にご準備下さい

STEP1 ファクトリを作成する

以下のコマンドファクトリを作成します。

php make:factory TaskFactory

ファクトリファイル名は「モデル名+Factory」の形式にすることを推奨します。
※理由は「STEP2 シーダを作成する」で解説します。

TaskFactory.phpが生成される
TaskFactory.phpが生成される

続いて、生成されたTaskFactory.phpdefinition()メソッドを以下のように編集します。

use Carbon\Carbon;
use Illuminate\Support\Str;

public function definition(): array
{
    return [
        'title' => Str::random(20),  // タスクタイトル
        'status' => 1,               // タスクの状態
        'due_date' => Carbon::now(), // 期限日
    ];
}

ポイントは、テーブルの各カラムに対して、以下のようにデフォルト値を設定している点です。

  • title …… Strファサードのrandom()メソッドで「20文字のランダムな文字列」を生成
  • status …… 固定値「1」=「未着手」を指定
  • due_date …… Carbonライブラリを使用して「今日の日付」を生成

このあと作成するシーダを実行してモデルインスタンスがデータベースへ追加されるときに、上記で設定したデフォルト値が自動設定されます。

STEP2 シーダを作成する

以下のコマンドシーダを作成します。

php make:seeder TaskSeeder

シーダファイルの名前は任意です。
※ここではわかりやすく「TaskSeeder」としています。

TaskSeeder.phpが生成される
TaskSeeder.phpが生成される

続いて、生成されたTaskSeeder.phprun()メソッドを編集します。

use App\Models\Task;

public function run(): void
{
    // テストデータを「10件」作成する
    Task::factory()->count(10)->create();
}

ここで重要になってくるのが、先ほど作成したファクトリファイル名が「モデル名+Factory」の形式になっていることです。

これにより、TaskモデルとTaskFactoryファクトリがLaravelによって自動的に紐づけされます。

逆に、ファクトリ名が「モデル名+Factory」の形式になっていない場合、モデルに対応するファクトリをLaravelが見つけだせず、Task::factory()が上手く実行できなくなります。

※もし任意のモデルとファクトリを紐づけたい場合は、「【補足】任意のモデルとファクトリを紐づける」をご覧ください。

STEP3 モデルを修正する

テストデータを自動作成する最後の準備として、モデルファイルに以下の2行を追加します。
※場合によってはすでに自動的に追加されているかもしれません。

use Illuminate\Database\Eloquent\Factories\HasFactory;

class Task extends Model
{
    use HasFactory; // 追加

    // ~ 省略 ~

}
ケケンタ

ここまでの手順で、テストデータを一括作成する準備が整いました!

STEP4 シーダを実行する

以下のコマンドを実行することで、指定したシーダが実行され、「STEP1 ファクトリを作成する」で設定したデフォルト値がテストデータとしてデータベースへ自動追加されます。

php artisan db:seed --class=TaskSeeder

実行結果

シーダの実行結果
シーダの実行結果

なお、作成済みの複数のシーダを一括実行したい場合は、「–class」オプションを除外します。

php artisan db:seed

【補足】任意のモデルとファクトリを紐づける

STEP2 シーダを作成する」でお伝えしたように、ファクトリファイル名を「モデル名+Factory」の形式にしなかった場合、Laravelが「どのモデルとどのファクトリが対応しているか」を判断できず、自動的な紐づけが行われません。

もしも任意のモデルとファクトリを紐づけたい場合は、以下のように手動でモデルファイルとファクトリファイルを編集する必要があります。

※以下は、SampleモデルSampleTableFactoryファクトリを手動で紐づける例です。

Sample.php(モデル)

use Database\Factories\Administration\SampleTableFactory;

/**
 * モデルの新ファクトリ・インスタンスの生成
 */
protected static function newFactory()
{
    return SampleTableFactory::new();
}

SampleTableFactory.php(ファクトリ)

use App\Administration\Sample;
use Illuminate\Database\Eloquent\Factories\Factory;

class SampleFactory extends Factory
{
    /**
     * このファクトリに対応するモデル名
     */
    protected $model = Sample::class;
}

まとめ

以上が、シーダとファクトリを使用して複数のテストデータを一括作成する方法でした。

Webアプリ開発をするときは、テストデータを作成することで動作確認などを行います。

そんなとき、テストデータをひとつひとつ手動で登録するのではなく、できるだけ効率的な方法を選択できると開発がはかどります。

Laravelにはそのための仕組みであるシーダとファクトリが用意されているため、これまで手動でテストデータを追加していたという方は、ぜひこれを機に活用してみて下さい。

ケケンタ

この記事が少しでも参考になったなら何よりです!

当ブログではPHPやLaravel、WordPressなどの情報を発信しています。

ご興味のある方はほかの記事もご覧いただけるとうれしいです!

それでは、最後までご覧いただきありがとうございました。

Laravel11でシーダとファクトリでテストデータを一括作成する方法のアイキャッチ画像

この記事が気に入ったら
フォローしてね!

この記事が良いと思ったらシェアしてね!

コメント

コメントする

CAPTCHA


目次