カテゴリ: Laravel 更新日: 2026/02/23

LaravelでファクトリとSeederを組み合わせてダミーデータを生成する方法!初心者でも簡単にテストデータ作成

LaravelのファクトリとSeederを組み合わせてダミーデータを生成する方法
LaravelのファクトリとSeederを組み合わせてダミーデータを生成する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Seederで初期データを入れるのは分かったんですが、テスト用の大量データを簡単に作る方法はありますか?」

先生

「ありますよ。LaravelにはFactoryという仕組みがあって、ダミーデータを自動で生成できるんです。それをSeederと組み合わせることで、大量のテストデータも簡単に作れます。」

生徒

「Factoryって具体的にどうやって使うんですか?」

先生

「それでは、手順を順番に見ていきましょう!」

1. Factory(ファクトリ)とは?ダミーデータ作成の強力な味方

1. Factory(ファクトリ)とは?ダミーデータ作成の強力な味方
1. Factory(ファクトリ)とは?ダミーデータ作成の強力な味方

LaravelのFactory(ファクトリ)は、データベースのテストや動作確認に必要な「ダミーデータ」を、まるで工場(Factory)のように自動で大量生産してくれる非常に便利な仕組みです。

プログラミングを始めたばかりの頃、動作確認のために手動でデータベースに「テスト太郎」「test@example.com」といったデータを1件ずつ入力したことはありませんか?数件なら良いですが、100件、1,000件となると現実的ではありません。Factoryを使えば、数行のコードで本物に近いデータを一瞬で用意できます。

未経験者向けイメージ例:
例えば、SNSアプリの開発中に「100人分のユーザープロフィール」が必要になったとします。
  • 手作業: 管理画面やデータベースツールから100回入力(1時間以上かかる…)
  • Factory: 「100人分作って」と命令するだけ(たった数秒で完了!)

具体的には、以下のようなデータ構成(定義)をあらかじめ決めておき、それを呼び出すことでランダムな値を生成します。


// Factoryのイメージ(※詳細は後述のステップで解説します)
[
    'user_name' => 'ランダムな氏名',
    'email' => '重複しないメールアドレス',
    'birthday' => 'ランダムな生年月日',
    'comment' => '「こんにちは!」などのランダムな文章',
];

このように、「本物に近いデータ構造」をテンプレート化しておくことで、開発効率が劇的に向上し、より実践的なテスト(ページネーションの動作確認や検索機能のテストなど)が可能になります。Laravel開発において、Seederとセットで覚えるべき必須スキルと言えるでしょう。

2. Factoryを作成する方法

2. Factoryを作成する方法
2. Factoryを作成する方法

まず、Factoryファイルを作成します。ターミナルで次のコマンドを入力してください。


php artisan make:factory UserFactory --model=User

このコマンドで、database/factories/UserFactory.phpが作成されます。--model=Userは、このFactoryがUserモデル用であることを指定しています。

3. Factoryの基本構文と記述例

3. Factoryの基本構文と記述例
3. Factoryの基本構文と記述例

Factoryファイルの中で、どのようなデータを生成するかを定義します。LaravelではFakerライブラリを使ってランダムデータを生成します。


use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    protected $model = \App\Models\User::class;

    public function definition(): array
    {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
            'password' => bcrypt('password123'),
        ];
    }
}

ここでは、nameにはランダムな名前、emailにはユニークなメールアドレス、passwordには暗号化された固定のパスワードを生成しています。

4. Seederと組み合わせてダミーデータを登録

4. Seederと組み合わせてダミーデータを登録
4. Seederと組み合わせてダミーデータを登録

次に、作成したFactoryをSeederで呼び出して、データベースに登録します。Seederは事前に作成しておきましょう。


use Illuminate\Database\Seeder;
use App\Models\User;

class UsersTableSeeder extends Seeder
{
    public function run(): void
    {
        // Factoryを使って10件のユーザーデータを生成
        User::factory()->count(10)->create();
    }
}

このようにcount(10)と指定することで、10件のダミーデータを一度に作成できます。create()を呼ぶことで、実際にデータベースに挿入されます。

5. Seederを実行してデータを確認

5. Seederを実行してデータを確認
5. Seederを実行してデータを確認

Seederを実行するには、次のコマンドを使います。


php artisan db:seed --class=UsersTableSeeder

これで、Userテーブルにダミーデータが登録されます。複数件のデータをすぐに確認できるので、開発中のテストやデザイン確認にとても便利です。

6. DatabaseSeederでまとめて実行する

6. DatabaseSeederでまとめて実行する
6. DatabaseSeederでまとめて実行する

全てのSeederをまとめて実行したい場合は、DatabaseSeeder.phpに呼び出しを追加します。


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

その後、次のコマンドで全てのSeederが一括で実行されます。


php artisan db:seed

7. マイグレーションとSeederを組み合わせる

7. マイグレーションとSeederを組み合わせる
7. マイグレーションとSeederを組み合わせる

新しい環境を作るときは、マイグレーションでテーブルを作り、Seederでダミーデータを挿入することが便利です。次のコマンドで両方を一度に実行できます。


php artisan migrate:fresh --seed

migrate:freshは既存のテーブルを削除して再作成するコマンドです。これに--seedを付けることで、Factoryを使ったダミーデータも一緒に作成されます。

8. 開発環境と本番環境での注意点

8. 開発環境と本番環境での注意点
8. 開発環境と本番環境での注意点

FactoryとSeederは開発やテスト環境で非常に便利ですが、本番環境では注意が必要です。誤ってダミーデータを本番データベースに入れると問題になる場合があります。

  • 本番環境ではSeederの実行を控える
  • 開発環境用のSeederはDatabaseSeederで分ける
  • 必要に応じて条件分岐を入れて安全にデータ登録する

まとめ

まとめ
まとめ

ここまで、LaravelにおけるFactory(ファクトリ)Seeder(シーダー)を活用したダミーデータの生成方法について詳しく解説してきました。Webアプリケーションの開発において、実際の運用に近いデータがデータベースに入っていることは、UIの崩れを確認したり、ロジックの正確性をテストしたりする上で非常に重要です。

今回学んだ手順を振り返ると、まずは php artisan make:factory コマンドを使用して、特定のモデルに対応したファクトリファイルを作成しました。このファイル内では、PHPのライブラリである Faker を利用して、名前やメールアドレスといった情報をランダムに定義しました。これにより、手動でSQLを書いたり、GUIツールから一行ずつデータを入力したりする手間が一切なくなります。

Laravel Factoryの高度な設定とカスタマイズ

基本的な使い方の他にも、Laravelのファクトリは非常に柔軟なカスタマイズが可能です。例えば、特定の状態(ステート)を持つデータを作成したい場合などは、以下のように state メソッドを定義することが一般的です。管理権限を持つユーザーだけを生成したい場合などのコード例を見てみましょう。


/**
 * 管理ユーザー状態の定義
 */
public function admin(): static
{
    return $this->state(fn (array $attributes) => [
        'is_admin' => true,
    ]);
}

このように定義しておくことで、Seeder側から User::factory()->admin()->create(); と呼び出すだけで、特定の条件を満たしたテストデータを瞬時に作成できます。複雑なアプリケーションになればなるほど、こうした「特定の役割を持ったデータ」が必要になるため、Factoryの仕組みを理解しておくことは開発効率に直結します。

リレーション(親子関係)を持つデータの生成

また、実際のプロジェクトでは「1人のユーザーが複数の投稿(Posts)を持っている」というような、テーブル間のリレーションが存在することがほとんどです。LaravelのFactoryでは、こうした親子関係のデータもメソッドチェーンで簡単に記述できます。


// 1人のユーザーに対して、5件の投稿を紐づけて作成する例
User::factory()
    ->hasPosts(5)
    ->create();

このコード一行で、親となるユーザーレコードと、それに紐づく5つの子レコードが生成されます。データベースの外部キー制約などを意識せずに、直感的なコードでテスト環境を構築できるのがLaravelの強みです。

効率的な開発フローの確立

最後に、チーム開発や個人の開発サイクルにおいて、php artisan migrate:fresh --seed コマンドを習慣化することをおすすめします。データベースの設計変更(マイグレーションの修正)を行った際に、古いデータを一度リセットし、常に最新の定義に基づいた清潔なダミーデータを投入し直すことで、「古いデータのせいでバグが起きる」という事故を防ぐことができます。

Laravelの機能をフル活用して、面倒なデータ準備を自動化し、本質的な機能実装に集中できる環境を整えていきましょう。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!FactoryとSeederを組み合わせるだけで、何百件ものデータが数秒で作れるなんて感動です。これまでは手作業でポチポチ入力していたので、時間がもったいなかったです……。」

先生

「そう言ってもらえると嬉しいです。エンジニアにとって『自動化』は最大の武器ですからね。ちなみに、Fakerを使えばメールアドレス以外にも、住所や電話番号、さらにはダミーの画像URLまで生成できるんですよ。」

生徒

「画像まで!それならプロフィール画面のテストも捗りますね。質問なのですが、もし特定の項目だけ決まった値にしたいときはどうすればいいですか?」

先生

「いい質問ですね。その場合は create メソッドの引数に配列を渡せば、その値だけを上書きできます。例えば、こんな感じですね。」


// 名前だけを固定して、他の項目はFactoryに任せる
User::factory()->create([
    'name' => 'テスト太郎',
]);

生徒

「なるほど!基本はランダムにしつつ、ログイン確認用のアカウントだけ固定値にするといった使い方ができそうですね。実行結果を確認するときも、これなら分かりやすいです。」

先生

「その通りです。実際に php artisan db:seed を実行したあとのターミナルの反応も見てみましょうか。」


Seeding: Database\Seeders\UsersTableSeeder
Database seeding completed successfully.

生徒

「この『Completed successfully』っていう文字を見ると安心します。これからマイグレーションファイルを更新するたびに、この連携技を使っていこうと思います!」

先生

「素晴らしい意気込みです。ただし、まとめでも話した通り、本番環境でこのコマンドを間違えて叩かないようにだけは注意してくださいね。migrate:fresh はテーブルを全部消してしまいますから。」

生徒

「……想像しただけでゾッとしました。設定ファイルなどで本番環境では実行できないようにガードをかける方法も、今度調べてみます!」

先生

「その調子で頑張りましょう。ダミーデータの扱いに慣れると、大規模なシステムのシミュレーションもスムーズにできるようになりますよ。」

関連記事:
カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのルーティングの基本を完全ガイド!YAML・PHP・アノテーションの違いもわかりやすく解説
New2
Laravel
LaravelでAPIのレスポンスをテストする方法を完全解説!assertJsonで初心者も安心
New3
CodeIgniter
CodeIgniterでRESTful API開発!初心者でもわかる全体構成ガイド
New4
Symfony
Symfonyのコントローラとは?作成・構造・役割を初心者向けにやさしく解説!
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのシングルアクションコントローラとは?使い方と利点
No.2
Java&Spring記事人気No2
Laravel
Laravelで動的パラメータをルートに渡す方法!初心者にもやさしいルートパラメータの使い方入門
No.3
Java&Spring記事人気No3
Laravel
Laravelでキャッシュを使う方法(ファイル・Redis・Memcached)
No.4
Java&Spring記事人気No4
Laravel
Laravelで名前付きルートを設定する方法!初心者でもわかるroute()関数の使い方
No.5
Java&Spring記事人気No5
Symfony
Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.7
Java&Spring記事人気No7
Laravel
Laravelのマイグレーション履歴を確認する方法を徹底解説!migrate:statusの使い方
No.8
Java&Spring記事人気No8
Laravel
Laravelのrefreshとfreshの違いを初心者でもわかる解説