2024.08.03
【Laravel】Seeder, Factoryの使い方

UnsplashLink Hoangが撮影した写真

はじめに

開発時に必須のダミーデータを手軽に作成する機能、「シーダー」と「ファクトリー」。

このページは、この2つの機能の基本的な使い方をまとめたページです。

Seederの使い方①Factory不使用

Seederの基本として、任意のダミーデータを作成する例です。

例で使用するDBは以下です。

テーブル名:messages
 カラム1:title
 カラム2:content

手順1.Seederファイル作成

コマンドラインで以下のコマンドを実行します。

 $ php artisan make:seeder [シーダーファイル名]
 例)$ php artisan make:seeder MessagesTableSeeder

 

上記コマンドを実行すると、以下の場所にファイルが作成されます。

シーダーファイル作成先 :/database/seeders/~.php

手順2.シーダーファイル編

シーダーファイルで、作成するダミーデータを定義します。

「/database/seeders/~.php」として作成されたシーダーファイルを編集します。

<?php
namespace Database\Seeders;
 
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

// 追加するとseederを利用したデータ生成が可能
use Illuminate\Support\Facades\DB;
 
class MessagesTableSeeder extends Seeder
{
    public function run(): void
    {
        // 基本の書き方 ////////////////////////
        // DB::table('テーブル名')->insert([
        //    'カラム名1' => '値1',
        //    'カラム名2' => '値2'
        // ]);
 
        // 書き方の例⓵1データずつ記述 ////////
        DB::table('messages')->insert([
            'title' => 'test title 1',
            'content' => 'test content 1'
        ]);

        // 書き方の例⓶:ループでデータ作成 ////////
    for($i = 1; $i <= 100; $i++){
            DB::table('messages')->insert([
                'title'   => 'test title ' . $i,
                'content' => 'test content ' . $i
            ]);
        }
    }
}

手順3.シーダーファイルを読み込む

シーダーは個別に実行することもできますが、

複数のシーダーファイルがある場合、DatabaseSeeder.phpで呼び出しておくと一括でシーディングできて便利です。

今回の例でもDatabaseSeeder.phpを使います。

 

「/database/seeders/DatabaseSeeder.php」を編集します。

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
 
class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([MessagesTableSeeder::class]);
    }
}

手順4.シーディングの実行

コマンドプロンプトで以下コマンドを実行するとダミーデータが作成されます。

$ php artisan db:seed
※DabaseSeeder.phpで指定したシーダ全て実行

■補足:個別にシーダーファイルを実行する

$ php artisan db:seed --class=MessagesTableSeeder

■全マイグレーションをやり直し、シーディングする

以下は、DB内の全てのデータを一度削除し、シーディングをやり直すコマンドです。(すごく便利!)

$ php artisan migrate:refresh --seed

Seederの使い方②Factory使用

例で使用するDBは以下です。

テーブル名:messages
 カラム1:title
 カラム2:content

手順1.Factoryファイルを作成する

$ php artisan make:factory [モデル名]
  例)$ php artisan make:factory Message

※ファイル作成先:/database/factories/MessageFactory.php

手順2.Factoryファイルの記述

Factoryファイルではダミーデータとしてどのようなデータを作成するかを定義します。

対象ファイル:/databases/factories/MessageFactory.php

<?php
namespace Database\Factories;
 
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Message; // 追記
 
class MessageFactory extends Factory
{     
    // definition()の処理全体の追記が必要
    public function definition()
    {
        $title = ['初投稿', 'title1', 'title2'];
        $content = ['はじめまして', ‘content1', 'content2'];

        $title = $title[rand(0, count($title) - 1)]
        $content = $content[rand(0, count($content) - 1)];
        return [
            'title' => $title,
            'content' => $content,
        ];
    }
}

この例では、$title、$contentの各配列の値をランダムに組み合わせたデータが作成されます。

手順3.DatabaseSeeder.phpの編集

<?php
namespace Database\Seeders;
 
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Message; //追記
 
class DatabaseSeeder extends Seeder
{
            public function run()
    {
        // 追記 以下では5件のダミーデータを作成する
        Message::factory()->count(5)->create();
                               //↑件数
    }
}

手順4.シーディング実行

以下コマンドにてシーディングできます。

$ php artisan db:seed

※全マイグレーションをやり直し、シーディングするコマンド
  php artisan migrate:refresh –seed

補足:Fakerを使う

ランダムなデータを作成したい場合に便利なのがFakerです。

Faker使う場合は「Seederの使い方②Factory使用」の流れで作業し、「手順2」の代わりに以下を実施するだけです。

■/config/app.phpを一部編集

app.phpの以下1行を編集します。

'faker_locale' => 'ja_JP'

■Factoryファイルを編集する

対象ファイル:/databases/factories/MessageFactory.php

<?php
namespace Database\Factories;
 
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Message; // 追記
 
class MessageFactory extends Factory
{     
    // definition()の処理全体の追記が必要
    public function definition()
    {
        return [
            'content' => $this->faker->realText(100), // ランダムな100文字
            'title' => $this->faker->realText(10),    // ランダムな10文字
        ];
    }
}

Fackerの使い方は以上です。

■Fakerで設定できる値

参考ページ:https://github.com/fzaninotto/Faker?tab=readme-ov-file#fakerproviderfile

ランダムな数字
 $this->faker->numberBetween(値の範囲);
 例)$this->faker->numberBetween(1, 100);

ランダムなテキスト
 $this->faker->realText(文字数);
 例)$this->faker->realText(100);

名前
 $this->faker->lastKanaName;
 $this->faker->firstKanaName;

ユーザID
 $this->faker->userName

電話番号
 $this->faker->phoneNumber

会社名
 $this->faker->company

郵便番号
 $this->faker->postcode

住所
 $this->faker->address

都道府県
 $this->faker->prefecture

市町村
 $this->faker->city

町、番地
 $this->faker->streetAddress

建物名、部屋番号
 $this->faker->secondaryAddress

 

シーディング、ファクトリーに関しては以上です。