LoginSignup
27
25

More than 3 years have passed since last update.

[Laravel8]Factoryの使い方メモ

Last updated at Posted at 2020-09-29

Laravel8でテストデータを入れたい時の、Factoryの使い方メモです。
環境:XAMPP for Windows, Laravel Framework 8.6.0

☞ 今回のケース ☜
・ 例えば、Twitterのクローンアプリを作っていて、ツイートを管理するテーブルにテストデータを入れたい時。
マイグレーションファイルはこのような感じ。↓↓ データを入れたいのは、'user_id'と、'body'の二つだけ。

database\migrations\2020_09_28_045814_create_tweets_table.php
    public function up()
    {
        Schema::create('tweets', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id');
            $table->string('body');
            $table->timestamps();
        });
    }

手順1.ターミナルで以下コマンドを打って、TweetFactory.php を作る。
・database\factories\TweetFactory.php にファイルができます!

php artisan make:factory TweetFactory --model=Tweet

手順2.Laravel8になってから、globalなfactory()関数は削除されました。その為、モデルのFactoryクラスを使います。
該当するモデルファイルに、『Illuminate\Database\Eloquent\Factories\HasFactory』がインポートされているかを確認すること。

\app\Models\Tweet.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory; // ←ここ確認。
use Illuminate\Database\Eloquent\Model;

class Tweet extends Model
{
    use HasFactory;
}

手順3:作成したTweetFactory.phpを編集する。
・連携するモデルがインポートされているかを確認して、return[]部分を追記します。

database\factories\TweetFactory.php
<?php

namespace Database\Factories;

use App\Models\Tweet; //←モデルがインポートされているかを確認!
use App\Models\User; //←モデルがインポートされているかを確認!
use Illuminate\Database\Eloquent\Factories\Factory;

class TweetFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Tweet::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'user_id' => User::factory(), //←ここ追記
            'body' => $this->faker->sentence //←ここ追記
        ];
    }
}

手順4. DatabaseSeeder.phpに追記する。

database\seeders\DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // \App\Models\User::factory(10)->create();
        \App\Models\Tweet::factory(10)->create(); //←ここ追記
    }
}

手順5.seedを実行する。
ターミナルで以下コマンドを実行します。

php artisan db:seed

以上で該当のテーブルにテストデータが入ります。
usersテーブルにもデータが入り。。
image.png

tweetsテーブルにもデータが入ってる!
image.png

テストデータを日本語にしたい場合は、config/app.phpの'faker_locale'を以下のように修正します。

config/app.php
'faker_locale' => 'ja_JP', 

以上です。

*因みに、上記の手順はteamsオプションを追加していない場合です。teamsオプションを有効にしてJetstreamをインストールしている場合は、以下の参考サイトさんで分かりやすく説明頂いていたので、ご参考に!

参考サイト:
https://blog.capilano-fw.com/?p=7827#Factory

27
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
25