#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.php の faker_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を初期データで満たす
次回はトランザクションと排他制御を学びます。