エンジニ屋.com(エンジニヤドットコム)

分かりやすくを意識して情報発信!

【Laravel】テーブル作成からテストデータ挿入方法【Model・migration・factory・seeder】

本記事ではDBテーブル作成からテストデータ挿入までの実装方法を流れに沿って紹介していきます。

それでは早速実装していきましょう!

必要ファイルを作成

投稿された記事を記録するPostテーブルを扱うことを前提とします。

まずはターミナルで下記のようにコマンドを実行します。

php artisan make:model Post --migration --factory
ポイント

1つ1つ必要なファイルを作成して良いのですが、オプションのコマンド「--migration」と「--factory」を付けることによって、Modelファイル作成と同時にmigrationファイルとfactoryファイルを作成できるので時短になります

先ずはそれぞれのファイルの役割を簡単に説明します。

Model

作成されたファイル場所: app\Models\Post.php

「このDBテーブルにデータ登録してくださいよ」とseederに認識をさせる為に作成する必要があります。

またfactoryと連携を取るために、Modelファイル内でHasFacotryクラスを呼び出している記述がデフォルトであります。

Migration

作成されたファイル場所: database\migrations\XXX_XX_XX_204035_create_posts_table.php

DBテーブルの構成を作成する為のファイルとなります。

Factory

作成されたファイル場所: database\factories\PostFactory.php

工場という意味があるようにテストデータを一度に大量に作成(製造)するためにデータの型のようなものをここに記述します。

seeder

元から存在するファイルに記述していきます。

seeder=「種を巻く」という意味があるようにfactoryで製造された型に種を巻いていくイメージです。(データを作成してDBテーブルに登録)

ではこれから順番に処理を記述して実行していきます。

migration

XXX_XX_XX_204035_create_posts_table.php

作成されたマイグレーションファイルに下記のように記述します。

public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->integer('user_id');
            $table->string('body');
            $table->timestamps();
        });
    }

upメソッドの中に作成するテーブル名・必要なカラムを定義します。

カラムはid・user_id・body・created_at・updated_atとなります。

user_idはUserテーブルとリレーションを定義するために記述していますが、本記事では触れません。

それではターミナルでコマンドを実行します。

php artisan migrate

実行が完了されたらDBを確認しましょう。

このようにテーブルが作成されているはずです。

列2つ目の物理名にカラム名が入っています。

因みにこちらは、A5:SQLというツールを使った画面となります。

phpMyAdminでも問題ございません。

ポイント

4つ目の列の必須が「Yes」になっています。
もしデータが保存される際に何も値が無ければエラーとなります。
もし空の値が保存されても良い場合は、nullable() メソッドを使用します。
例) bodyカラムに許容する場合、"$table->string('body')->nullable();"と記述します。

Factory

次にテストデータを挿入する準備をFactoryに記述します。

public function definition()
    {
        return [
            'user_id' => $this->faker->randomNumber(1),  //1桁のランダム数字
            'body' => $this->faker->realText(20),  //20文字のテキストメッセージ
        ];
    }

use_idカラムにはランダムな数字を挿入、bodyカラムにはテキストメッセージを挿入する型を作成しました。

seeder

factoryの内容をseederに記述してコマンドを実行してテストデータを登録します。

public function run()
    {
        //\App\Models\User::factory(10)->create();
        \App\Models\Post::factory(5)->create();
    }

Postクラスからfactoryメソッドを呼び出してcreate()しています。

factoryメソッドの引数に5が入っていますが、こちらはテストデータの数です。

データベースを確認します。

テストデータがちゃんと5つ入っています。

Factoryはファイル名で自動で紐づくようにLaravelが裏で処理してくれます

仮にFactoryファイル名をPostFactory.phpではなく、適当にPossFacotry.phpとします。

コマンドを実行するとエラーとなります。

おまけ

挿入したbodyカラムのテストデータは英語でした。

もし日本語にしたい場合は、config\app.phpの109行目あたりを下記記述に変更してください。

'faker_locale' => 'en_US',
↓
'faker_locale' => 'ja_JP',

以上、お疲れ様です!

factoryでのテストデータを非常にシンプルなデータとしましたが、実際には色々なパターンのテストデータを挿入する場面があります。

その為にfackerライブラリにどのようなメソッドが存在するか知る必要があります。

次回はそのあたりを記事にしようと思います!