バックエンド

【Laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfaker【初心者向け】

PHP現場の中の人
プログラミングってほとんどデータベースとのやりとりじゃないですか。
PHP現場の中の人
データベースからのデータをどう表示させるかっていう。

『PHPの現場』というポッドキャストの放送で、ひときわ印象に残ったこの言葉。

そう言われると確かに、例えばゲームなら、

  • アイテムの名前
  • アイテムの数
  • HPにMP
  • 敵の名前
  • 敵の種類
  • 画像/動画データ など、

ありとあらゆるデータが『データベース』に保存されていてやりとりされています。

データベース・・たくさんのデータが保存できるソフト。MySQLなど。

仕事で使うような在庫管理、勤怠管理、予約管理なんかのシステムももれなく『データベース』にデータが保存されています。

何かしらのプログラミング言語を使って、

『データベース』の中のデータを表示させたり、計算したり、時には消したりしています。

PHP現場の中の人
プログラミングってほとんどデータベースとのやりとりじゃないですか。
PHP現場の中の人
データベースからのデータをどう表示させるかっていう。
アオキ
そう言われると確かにそうかもなー

と思ったりしたわけです。

効率的にプログラミングするために考え出された『MVC(エムブイシー)モデル』でも、

『データベース』とのやりとりが重要視されています。

M・・モデル データベースとのやりとり
V・・ビュー 見た目
C・・コントローラー データの処理

一生懸命何かしらのソフトを作ったとしても、

仮にデータの計算が間違ってたり、金額計算が間違ってたりするとえらいこっちゃです。

ゲームでも最初からレベル99になったら興ざめしちゃうし、

はぐれメタル倒しても経験値1ならなんでやねんってなっちゃうし、

ATMに1万円入金したはずが 2000円とかになっちゃったらえらいこっちゃです。

なので、

チェックする人
きちんと計算できてるよね?
チェックする人
間違ってないよね?

という確認の意味を込めて、

『ダミーデータ(テストデータ)』を登録しつつテストしてみるという手順が必要になります。

とはいえ『ダミーデータ(テストデータ)』を1つずつ手で入力していくと、

10件くらいなら頑張れるかもしれないけれど、
100件、1000件と数が増えるにつれ苦行にしかならないし、

データベースつくってる人
データベース構成ちょっと変えたからやりなおしー

なんてことになって、『テストデータ』をまたイチから手打ちで登録なんてやってると日が暮れちゃうし。

ということで、先人達が知恵を絞って、

先人達
ダミーデータ(テストデータ)をさくっとつくれるようにしよかー

と、『ダミーデータ(テストデータ)』をさくっとつくれる仕組みをつくってくれました。

PHPのフレームワーク『Laravel(ララベル)』でも、

『ダミーデータ(テストデータ)』をさくっと作れる仕組みが含まれています。

正直なところ、『Laravel(ララベル)』を覚えた当初は、

アオキ
なにやらめんどい設定ばっかでとっつきにくいなぁ

と思っていたんですが、

実際にWebアプリをつくっていくうちに、

  • データベースの構成が変わって作り直し
  • その度にダミーデータを手打ちし直し

という事をやっていて、かなりムダな時間がかかっていたので、

ある程度『Laravel(ララベル)』に慣れて、webアプリをつくろうという段階になったら、

ぜひダミーデータ作りに挑戦してもらえたらと思います。

アオキ
慣れれば慣れるほど手放せなくなってきまっせ。

Laravel 5.5 で試しています。

Sponsored link

Laravelでダミー(テスト)データを作る仕組み

『Laravel(ララベル)』で『ダミーデータ(テストデータ)』を作成する場合、
大きく3つのツールを使うことになります。

  1. seeder(シーダー)・・ダミーデータを登録できる
  2. faker(フェイカー)・・ダミーデータを生成できる
  3. factory(ファクトリー)・・ダミーデータの量産装置

イメージはこんな感じでしょうか。(雑ですみません)

画面右のモデルに対して、

『ダミーデータ(テストデータ)』を投入していきます。

『ダミーデータ(テストデータ)』を作る方法は大きく2つあると思っていて、

1.seeder(シーダー)に直接書く・・少しのデータならこれでOK

か、

2. faker(フェイカー)とfactory(ファクトリー)を使う・・大量のデータをつくるならこっち

になります。

まずは画面右の『モデル』をつくってみます。

Laravelで『ダミー(テスト)データ』を作るその前に まずはモデルつくりから

まずは『Laravel(ララベル)』のインストールから。

composer create-project --prefer-dist laravel/laravel blog "5.5.*"

のコマンドで『Laravel(ララベル)』をインストールします。

『Laravel(ララベル)』インストールの参考記事

無事インストールできたらおもむろに『モデル』をつくります。

今回は『Dept(部署)』というモデルと、『Employee(従業員)』というモデルをつくる想定にしてます。

営業や総務という部署があって、その中に働く人が何人かいる、という想定になります。

下記のコマンドで『モデル』が生成されます。

php artisan make:model Dept -m

生成された『Dept』モデルをちょっといじって、

//Laravel/app/Dept.php
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Dept extends Model
{
    protected $fillable = [
        'dept_id',
        'dept_name',
    ];

    //hasMany設定
    public function employees()
    {   
        return $this->hasMany('AppEmployee','dept_id','dept_id');
    }
}

『Employee』モデルもつくって、

php artisan make:model Employee -m

『Employee』モデルもちょっといじって、2つの『モデル』を紐づけています。

(紐づけ関連はおいおい記事にする予定です。)

//Laravel/app/Employee.php
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Employee extends Model
{

    protected $fillable = [
        'dept_id',
        'name',
    ];

    //belongsTo設定
    public function depts()
    {
        return $this->belongsTo('AppDept','dept_id','dept_id');
    }
}

『モデル』を作る時に、 -m というオプションをつけていたので、

『マイグレーションファイル』も同時生成されます。

マイグレーションファイル・・データベースの中のテーブルの雛形。

こちらもちらっと追記して、

//Laravel/database/migrations/create_depts_table.php
<?php

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateDeptsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('depts', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('dept_id');
            $table->string('dept_name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('depts');
    }
}

employee側のマイグレーションファイルもちらっと追記して。

//Laravel/database/migrations/create_employees_table.php
<?php

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateEmployeesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('employees', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('dept_id');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('employees');
    }
}

ここまでで2つの『モデル』が作成できました。

今のところ、データベースの中に『Dept』と『Employee』2つの箱はつくったけど、

中身のデータが全然入ってない状態です。

ここに『ダミーデータ(テストデータ)』や初期データをいれるようにしてみます。

Sponsored link

Laravelでダミー(テスト)データを作る手順その1 シーダーに直で書いて設定

さっそくダミーデータを書いていきます。

まずは『Dept(部署)』の方から。

おもむろにこんなコマンドをうつと、

php artisan make:seed DeptsTableSeeder

『DeptsTableSeeder.php』というファイルが生成されるので、ガリガリと書いていきます。

『Dept(部署)』の方は、部署の種類が今回はそこまで多くないので手入力でいいかなと思ったりします。

//Laravel/database/seeds/DeptsTableSeeder.php

<?php

use IlluminateDatabaseSeeder;

class DeptsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
        DB::table('depts')->insert([
        ['id' => '1',
        'dept_id' => '1',
        'dept_name' => '営業',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ],
        [
        'id' => '2',
        'dept_id' => '2',
        'dept_name' => '総務',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ],
        [
        'id' => '3',
        'dept_id' => '3',
        'dept_name' => 'システム',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ],
        [
        'id' => '4',
        'dept_id' => '4',
        'dept_name' => '人事',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ],
        [
        'id' => '5',
        'dept_id' => '5',
        'dept_name' => '幹部',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ],        
    ]);
    }
}

こんな感じですね。

『Seeder(シーダー)』は各モデルごとに生成する必要があって、それらを取りまとめる『DatabaseSeeder.php』というファイルに紐付けます。

//Laravel/database/seeds/DatabaseSeeder.php
<?php

use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
          $this->call(DeptsTableSeeder::class);
    }
}

この状態で下記コマンドをうつと、

php artisan db:seed

『データベース』の『Dept(部署)』の中に入力した部署が登録されます。

こんな感じになります。

また、下記のコマンドをうつと、

php artisan migrate:refresh –seed

データベースの中のテーブル構成をまるっと初期化しつつ、『Seeder(シーダー)』に書いたデータをまるっと再登録してくれます。

アオキ
慣れれば慣れるほどめっさ便利でっせ。
Sponsored link

Laravelでダミー(テスト)データを作る手順その2 fakerとfactoryでダミーデータを大量生成

『Dept(部署)』側ができたので、続いて『Employee(従業員)』のダミーデータ。

人数が少なければ手打ちでもいいんですが、

せっかくなので 大量の人数を登録してみることにします。

下記コマンドで『factory』をつくります。

php artisan make:factory EmployeeFactory

すると、

laravel/database/factories/EmployeeFactory.php

という『factory(ファクトリー)』ファイルが生成されます。

『factory(ファクトリー)』ファイルの中で、『faker(フェイカー)』を使って『ダミーデータ』をつくります。

『faker(フェイカー)』には、

  • ダミー名前
  • ダミーメールアドレス
  • ダミーの数値
  • ダミーの郵便番号
  • ダミーの日付

などたくさんのオプションがあるので詳細はマニュアルを参照いただくことにしつつ、

今回はこんな内容にしました。

<?php

use FakerGenerator as Faker; //ここでfakerを読み込み

$factory->define(AppEmployee::class, function (Faker $faker) {
    return [
        //
        'name' => $faker->name,
        'dept_id' => $faker->numberBetween($min = 1, $max = 5),
        'created_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),
    ];
});

なんとなくわかるかもですが、

$faker->nameでダミーの名前をつくって、

$faker->numberBetween($min = 1, $max = 5) で1から5までランダムに登録して、

$faker->datetime($max = ‘now’, $timezone = date_default_timezone_get()) で最大値を現在時刻にしてます(ここは適当です)。

『factory(ファクトリー)』と『faker(フェイカー)』を設定した後で、

『Seeder(シーダー)』側で、実際にダミーデータを登録します。

このコマンドで『EmployeesTableSeeder.php』を生成して、

php artisan make:seed EmployeesTableSeeder

先ほど作った『factory』と、生成したいダミーデータの数を追記します。

//Laravel/database/seeds/EmployeesTableSeeder.php
<?php

use IlluminateDatabaseSeeder;

class EmployeesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
    //
    factory(AppEmployee::class, 50)->create(); //50個のダミーデータを生成
    }
}

『Seeder(シーダー)』の取りまとめ役の『DatabaseSeeder.php』にも追記して、

//Laravel/database/seeds/DatabaseSeeder.php
<?php

use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
          $this->call(DeptsTableSeeder::class);
          $this->call(EmployeesTableSeeder::class);
    }
}

ここまでで、

php artisan migrate:refresh –seed

とやると、『ダミーデータ』が登録できてしまいます。

ただ一点注意点があって、『faker(フェイカー)』は初期設定だと英語でデータ生成しますので

もし日本語対応したい場合は『app.php』ファイルと『.env』ファイルに追記必要です。

■Laravel/config/app.php

/*
|--------------------------------------------------------------------------
| Faker Setting
|--------------------------------------------------------------------------
*/
'faker_locale' => env('DEV_FAKER_LOCALE', 'en_US'),

■Laravel/.env

DEV_FAKER_LOCALE=ja_JP

2つのファイルに追記した後に、

php artisan migrate:refresh –seed

のコマンドをうてば50件のダミーデータがものの10秒でできちゃいます。

アオキ
Laravel半端ねー、そんなんできんやん普通ー

さいごに

最初から一発でWebアプリなりソフトウェアがバッチリ完成できればいいのですが、

人間たるもの、どうしてもちょっとした間違いはでてくるし、

実際に作りながら、

もの作りする人
やっぱりこうしたほうがいいんじゃないか

なんて思いもでてきます。

今回はたった2つの、しかもかなり簡単な構成でしたが、

実際のWebアプリとなればテーブルだけで数十に及びますし、

その繋がりも山ほどでてくるので、

その度に手打ちで『ダミーデータ』をうっているととてもじゃないけど仕事にならなくなっちゃいます。

先人達が編み出した、『ダミーデータ』をさくっとつくる仕組みをうまいこと活用して、

さくっと仕事してさくっと帰れるような効率的な働き方をしていきたいもんです。

『Laravel』ではこんな記事も読まれています。

1. 【Laravel】マルチログイン対応ECサイトの講座をリリースしました【Udemy】

2. 【PHP/Laravel】初心者向けの動画をリリースしました【Udemy】

3. 【Laravel(PHP)】初心者向け アプリのつくり方 をリリースしました【techpit】

4. 『Carbon』でよく使うパターンをまとめてみた【Laravel向け】

5. 【Laravel(PHP)】でできる事をわかりやすく(ざっくりと)まとめてみた【用語集も兼ねて】【初心者向け】

6. 【Laravel】フロントエンドをわかりやすくまとめてみた【初心者向け】

7. 【PHP】【Laravel】CSVエクスポートの方法〜5つのポイント〜

8. 【PHP】CSVインポートの方法〜大量データもバルクインサートでバッチリ!〜【laravel】

9. 【Laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfaker【初心者向け】

10. 【Laravel】Webアプリ環境構築の仕方【Vue.js】【初心者向け】

11. 【Laravel】と【Vue.js】のサンプル動画を見ながらさらりと解説してみる

12. 【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた【体験談】

13. 【Laravel】フォトギャラリーを作るための画像アップロード方法【php】

14. 【Laravel】多対多テーブルを複数つくる方法【ちょっとコツがいります】

15. 【Laravel】【Slack】に通知する方法をまとめてみた【自作ファサード】

アオキ
ツイッターでも記事ネタ含めちょろちょろ書いていくので、よろしければぜひフォローお願いしますm(_ _ )m

アオキのツイッターアカウント


関連記事一覧 (一部広告あり)

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


最近の記事

アーカイブ

  1. オンライン教材

    【React】初心者向け講座をリリースしました【MUI】【Udemy】
  2. オンライン教材

    ChatGPTをビジネス活用する講座をリリースしました【Udemy】
  3. オンライン教材

    【ChatGPT】エンジニア編をリリースしました
  4. 生成AI

    Dify講座をリリースしました【非エンジニア向け】
  5. データベース

    MySQLの講座をリリースしました
PAGE TOP
Ads Blocker Image Powered by Code Help Pro

広告ブロックを摘出しました!!

ブラウザ拡張を使用して広告をブロックしていることが摘出されました。

ブラウザの広告ブロッカーの機能を無効にするか、
当サイトのドメインをホワイトリストに追加し、「更新」をクリックして下さい。

あなたが広告をブロックする権利があるように、
当方も広告をブロックしている人にコンテンツを提供しない権利と自由があります。

Powered By
100% Free SEO Tools - Tool Kits PRO