#12 Laravel基礎

ファクトリーとシーダーでテストデータを作る

ファクトリーとは

ファクトリー? テスト用のダミーデータを自動生成する仕組み。Fakerライブラリと組み合わせてランダムなデータを大量に作れる。 は、テストや開発用のダミーデータを自動生成する仕組みです。本物そっくりなデータ(名前・メールアドレス・本文など)をランダムに作れます。


ファクトリーを生成する

php artisan make:factory PostFactory --model=Post

database/factories/PostFactory.php が生成されます。

<?php
// 📁 database/factories/PostFactory.php

namespace Database\Factories;

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

class PostFactory extends Factory
{
    public function definition(): array
    {
        return [
            'user_id' => User::factory(), // ← Userも自動で作成してくれる
            'title'   => fake()->sentence(6),          // 例:"Quo Labore Et Vel At"
            'body'    => fake()->paragraphs(3, true),  // 3段落のダミーテキスト
            'status'  => fake()->randomElement(['draft', 'published']),
            'created_at' => fake()->dateTimeBetween('-1 year', 'now'),
        ];
    }
}

fake() ヘルパーはFakerライブラリへのショートカットです。


モデルに HasFactory を追加する

<?php
// 📁 app/Models/Post.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory; // ← これが必要
}

ファクトリーの使い方

// 投稿を1件作成
Post::factory()->create();

// 投稿を10件作成
Post::factory()->count(10)->create();

// 属性を上書きして作成
Post::factory()->create([
    'title'  => '固定タイトル',
    'status' => 'published',
]);

// DBに保存せずインスタンスだけ作る(テスト用)
$post = Post::factory()->make();

ステートを定義する

特定の状態のモデルを作りたい場合はステートを定義します。

<?php
// 📁 database/factories/PostFactory.php

public function published(): static
{
    return $this->state(fn () => [
        'status'       => 'published',
        'published_at' => now(),
    ]);
}

public function draft(): static
{
    return $this->state(fn () => [
        'status'       => 'draft',
        'published_at' => null,
    ]);
}

使い方:

// 公開済みの投稿を5件作成
Post::factory()->published()->count(5)->create();

シーダーとは

シーダー? データベースに初期データや開発用テストデータを流し込む仕組み。手動で入力しなくてもDBにデータを用意できる。 はファクトリーで生成したデータをDBに流し込む仕組みです。

php artisan make:seeder PostSeeder
<?php
// 📁 database/seeders/PostSeeder.php

namespace Database\Seeders;

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

class PostSeeder extends Seeder
{
    public function run(): void
    {
        // 公開済み投稿を20件生成
        Post::factory()->published()->count(20)->create();

        // 下書きを5件生成
        Post::factory()->draft()->count(5)->create();
    }
}

DatabaseSeeder から呼び出します。

<?php
// 📁 database/seeders/DatabaseSeeder.php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        // 順番に注意:外部キーの参照先を先に作る
        $this->call([
            UserSeeder::class,  // ← Postより先に実行
            PostSeeder::class,
        ]);
    }
}

シーダーを実行する

# DatabaseSeeder を実行
php artisan db:seed

# 特定のシーダーだけ実行
php artisan db:seed --class=PostSeeder

# マイグレーションを全部やり直してシーダーも実行
php artisan migrate:fresh --seed

Fake日本語データを使う

config/app.phpfaker_locale を変えると日本語のダミーデータが生成できます。

// 📁 config/app.php

'faker_locale' => 'ja_JP',
fake()->name()     // → "山田 太郎"
fake()->address()  // → "東京都渋谷区..."
fake()->phoneNumber() // → "090-xxxx-xxxx"

まとめ

  • php artisan make:factory でファクトリーを生成する
  • definition() にFakerを使ってランダムデータの定義を書く
  • factory()->create() でDBにデータを作成できる
  • ステートで特定の状態のデータを作り分けられる
  • シーダーでファクトリーを呼び出してDBを初期データで満たす

次回はトランザクションと排他制御を学びます。