【Laravel8】テストデータ作成はこれ一択 ファクトリーとfaker

2021年10月19日

こんにちは。今回はモデルファクトリーとfakerという機能を使って、Laravelでダミーデータを生成していきたいと思います。この2つの機能を使えば簡単に開発用のダミーデータを生成することができます。多少覚える手順は多いのですが、覚えてしまえば開発の大きな味方になってくれると思います。それでは見ていきましょう。

データベースへの接続と作成

今回はデータベースにsqliteを使用します。sqliteの設定方法は過去の記事を参照してください。Laravelでsqliteデータベースに接続する

また、本記事で取り扱うテーブルを事前に作成してください。過去の記事【Laravel】マイグレーションでテーブル作成の手順で作成できます。

Eloquentモデルの作成

まずはテーブルを操作するためのEloquentモデルを作ります。以下のコマンドを実行してください。app/Models配下にPostクラスが作られます。

$ php artisan make:model Post

# 成功時のメッセージ
Model created successfully.

モデルファクトリーの作成

モデルファクトリーとはモデルを生成する工場(ファクトリ)です。ダミーデータを生成する役割を持っています。

Postモデルを生成するファクトリークラスを作成します。クラス名はPostFactoryとします。–modelオプションを付けることで、使用するEloquentモデルを指定することができます。先程作成したPostモデルを使用するために–model=Postとします。成功するとdatabase/factories/PostFactory.phpが作成されます。

$ php artisan make:factory PostFactory --model=Post

# 成功時のメッセージ
Factory created successfully.

作成されたPostFactoryクラスが次のコードです。definitionメソッドが一つ存在するだけのクラスが作成されます。definitionの中でテストデータの内容を定義していくことになります。また、ファクトリーを作成する際に–model=PostでPostモデルを指定しましたので$model変数にPostクラスが指定されて、Postクラスを使う準備が整っています。

<?php

namespace Database\Factories;

use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Post::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            //
        ];
    }
}

definitionメソッドの中身を作りましょう。このメソッドはモデルの1データ分の項目を連想配列で返すように記述します。今回値はfakerで自動生成するようにします。$this->fakerでfakerを参照し、その後に用途に合わせて自動生成用のメソッドを付与します。例えばcontent列は記事の内容が入るのでrealTextメソッドを使用しています。

    public function definition()
    {
        return [
            'title' => $this->faker->title(),
			      'content' => $this->faker->realText(),
            'user_id' => $this->faker->randomDigit()
        ];
    }

fakerでは様々なダミーデータを作ることができます。リファレンスで調べて使いましょう。私は次のサイトを使って調べました。https://fwhy.github.io/faker-docs/

Seederの作成と実行

ファクトリーが完成したら、シーダー(Seeder)を作成します。シーダーはファクトリーで生成したダミーデータをデータベースに登録する役割を持ちます。今回はPostTableSeederを作成します。

$ php artisan make:seed PostsTableSeeder

# 成功時のメッセージ
Seeder created successfully.

Seederを作成するとrunメソッドが作られています。runメソッドはSeeder実行時に呼ばれるメソッドなので、この中にダミーデータ作成処理を記述していきます。先程作成したファクトリーを呼び出して、モデルを生成してみましょう。countメソッドに作成するデータ件数を指定し、createメソッドを実行します。

    public function run()
    {
        \App\Models\Post::factory()->count(50)->create();
    }

最後にPostTableSeederを呼び出すためのコードを記述します。Seederは全てdatabase/seeders/DatabaseSeeder.phpから呼び出して使います。先程作成したPostTableSeederを登録しましょう。

    public function run()
    {
        $this->call(PostsTableSeeder::class);
    }

artisan db:seedコマンドでSeederを実行しましょう。

$ php artisan db:seed

#成功時の実行結果
Seeding: Database\Seeders\PostsTableSeeder
Seeded:  Database\Seeders\PostsTableSeeder (1,850.64ms)
Database seeding completed successfully.

これでPostsテーブルにダミーデータを50件作成することができました。

Laravel

Posted by kobainmac