ブログ


【Laravel】Factory&Fakerで日本語のダミーデータを登録する
目次
はじめに
Laravelには、ダミーデータをDBに登録するためのFactoryと、ダミーテキストを作成するためのFakerが標準で搭載されています!
今回は、「日本語のダミーデータをDBに登録する方法」をご紹介します!また、リレーション込みでのデータの作り方についても軽く触れていきます。
検証環境は以下の通りです。
- Laravel:11.34.1
- PHP:8.3.14
- MySQL:8.4.0
ダミーデータ作成までの流れ
例として、Shops(店)
テーブル・モデルが既に存在する前提で、このテーブルに対してダミーデータを登録する手順を解説します!
①ファクトリ(Factory)ファイルを用意する
ファクトリには、「どのテーブル(モデル)に対して」「どのようなデータを生成するか」を定義します。
以下のArtisanコマンドで、database/factories
ディレクトリ内に新しいファクトリファイルが作成されます。オプションをつけることで、関連ファイルを同時に作成することもできます。
// ファクトリのみを作成
$ php artisan make:factory ShopFactory
// ファクトリ + モデルを同時に作成
$ php artisan make:model Shop --factory
// ファクトリ + マイグレーション + モデル + シーダーを同時に作成
$ php artisan make:model Shop -mfs
次に、作成されたファクトリファイルを編集し、「対応するモデル」と「生成するダミーデータの内容」を記述します。
Fakerで用意できるダミーテキストの種類はとても豊富で、実際のアプリケーションでよく使うフィールドを簡単に生成できます! name()
(名前)やemail()
(メールアドレス)、text()
(文章)、emoji()
(絵文字😊)、bloodType()
(血液型)などなど…。その他の関数は、Faker公式サイトのFormattersタブからチェックしてみてください!
use App\Models\Shop;
use Illuminate\Database\Eloquent\Factories\Factory;
class ShopFactory extends Factory
{
// 対応するモデルを指定
// クラスの名前が 「モデル名 + Factory」 の形式であれば省略可能
protected $model = Shop::class;
// 生成するダミーデータの内容を定義
public function definition(): array
{
return [
'shop_name' => $this->faker->company, // 店名
'shop_address' => $this->faker->address(), // 住所
'shop_phone_number' => $this->faker->phoneNumber(), // 電話番号
];
}
}
②ファクトリとモデルを紐づける
①で作成したファクトリを有効にするために、対象のモデルに HasFactory
トレイトを追加します(ちなみにArtisan
コマンドでモデルを作成した場合は、デフォルトでHasFactory
がついているので、この工程はスキップ可能です)
以下のようにモデルファイルを編集します。
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Shop extends Model
{
use HasFactory; // 追加
③Fakerの設定を日本語にする
Fakerで生成されるダミーデータを日本語にするために、ja_JP
を指定します。Laravelのバージョンによって指定方法が異なるので注意してください⚠️
ここでja_JP
を指定することで、name()
(名前)や address()
(住所)、phoneNumber()
(電話番号)などが、日本向けの形式で生成されるようになります!実際にどんなデータがどんな仕組みで生成されるか気になった方は、vendor/fakerphp/faker/src/Faker/Provider/ja_JP
フォルダ配下のPHPファイルから中身を確認できるのでぜひ〜🔍
- Laravel 10.x以前
config/app.php
を直接書き換えます。
'faker_locale' => 'en_US',
// ↓ 変更
'faker_locale' => 'ja_JP',
- Laravel 11.x 以降
.env
ファイルを書き換えます(APP_FAKER_LOCALE
が使用されます)
APP_FAKER_LOCALE=en_US
# ↓ 変更
APP_FAKER_LOCALE=ja_JP
④シーダーを実行 → データ登録!
①で作成したファクトリファイルを元にダミーデータを作ります。
ここではシーダーを用いる方法をご紹介します。シーダーは以下のコマンドで作成できます。
$ php artisan make:seeder ShopSeeder
作成されたシーダーに対し、①で作成したファクトリの呼び出しを記述します。
use Illuminate\Database\Seeder;
use App\Models\Shop;
class ShopSeeder extends Seeder
{
public function run(): void
{
Shop::factory()->count(5)->create(); // 店データを5件作成
}
}
最後に、以下のコマンドでシーダーを呼び出して、ダミーデータの作成完了です!
$ php artisan db:seed —class=ShopSeeder
リレーション込みのダミーデータを作る方法
ファクトリを使って、リレーションをもつ関連データをまとめて一括生成する方法をご紹介します!今回は、以下のような「親・子・孫」の関係を持つリレーションを例にします🛒
- 親要素:店(
shops
) - 子要素:商品(
items
) - 孫要素:レビュー(
reviews
) - 関係性:
- 1つの店が複数の商品を持つ(1対多)
- 1つの商品が複数のレビューを持つ(1対多)
①子要素(Item)のファクトリ設定
shop_id
カラムで、親要素のShop
モデルと紐づけます。
public function definition(): array
{
return [
'shop_id' => Shop::factory(), // Shopと紐付け
'item_name' => $this->faker->word,
];
}
②孫要素(Review)のファクトリ設定
item_id
カラムで、子要素のItem
モデルと紐づけます。
public function definition()
{
return [
'item_id' => Item::factory(), // Itemと紐付け
'comment' => $this->faker->realText(50),
];
}
③親要素のシーダーを調整
親要素( Shop
)のシーダーでhas()
メソッドを使って指定するだけで、子・孫要素のデータも一気に生成できます!以下の場合だと、「5店舗 × 各5商品 × 各商品に3レビュー」の構造がまとめて生成されます。has()
は、リレーション先のデータを一緒に作るためのメソッドです✨ 詳しくは公式ドキュメント(Eloquent ファクトリ – リレーションのファクトリ)も参考にしてみてください。
use Illuminate\Database\Seeder;
use App\Models\Shop;
use App\Models\Item;
use App\Models\Review;
class ShopSeeder extends Seeder
{
public function run(): void
{
Shop::factory()
->count(5) // 5つの店を生成
->has(
Item::factory()
->count(5) // 各店に5個の商品
->has(Review::factory()->count(3)) // 各商品に3件のレビュー
)
->create();
}
}
終わりに
今回は、Laravelで日本語のダミーデータを登録する方法をご紹介しました。
FactoryとFakerを活用すれば、テストや開発用のデータを簡単に生成できてとても便利です!さらに日本語の指定をしておくと、より実際の画面に近い・馴染みのあるデータとなるため、確認作業もしやすくなると思います👍
開発中のちょっとした確認や、リレーション構造のテストにも役立つので、ぜひ活用してみてください〜!
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!