【Laravel】Laravel6でテストデータを作成する方法

:::note warn
エンジニア初心者の投稿であるため、間違っている箇所が多くあるかと思います。
間違っているなどあればご教授いただけると幸いです。
:::

# はじめに
私は仕事において初めてlaravelの機能である、Factoryというものを使用してテストデータを作成しました。最新バージョンのLaravelを使った解説が多く、指定のバージョン6についてまとめられているものが少なかったです(検索力不足かもしれませんが...)。そこで今回は色々ハマりながらも、作成できたので、記録として残したいと思います。

# Factoryとはなんぞや
laravelの標準機能であるFactoryは一言でいうと、DBに対して大量のテストデータ(レコード)を作りたい時に使う機能です。<br>
例えば...
| 名前　| 年齢 | 電話番号 | メールアドレス |
|:-:|:-:|:-:|:-:|
|  キー太郎 |  5 |090-0123-4567| aaaaa@example.com |
|  ... |  ... |....|....|
|  キー子 |  5 |070-0123-4567| bbbb@example.com |

このようなリレーションデータベースがあったときにテーブルに対して、レコード数を増やした時にどのような挙動になるかを知っておく必要があります。増やすといっても1〜何十ではなく、何百、何千単位で作成しないと作成してもテストデータとして意味がないです。全て手打ちしてもいいですが、あまりにも効率が悪すぎる。その時に活躍してくれるのがFactoryという機能です。

# 実例
実際にFactoryが利用できるまでの流れを説明します。すでにLaravel6を利用していることを前提で話を進めます。また、Factoryの説明以外は省かせていただきますので、ご了承ください。
### Laravelのバージョン
Laravel 6.*（今回テストデータを入れるテーブル名: UserList)

### ⓪必要ファイルを作成する
- Modelファイル
Modelについて理解ができていな人はこちらの記事をみてください。

https://arc.net/l/quote/reccqgbp

```terminal:terminal
php artisan make:model User
```

:::note info
artisanコマンドで作成されたものは以下のディレクトリ内にあります。
/src/app/User.php
:::

<br>

- Seederファイル
Seederについて理解ができていな人はこちらの記事をみてください。

https://qiita.com/3y9Mz/items/bead12cdab34a5ebe69f

```terminal:terminal
php artisan make:seeder UsersSeeder
```

:::note info
artisanコマンドで作成されたものは以下のディレクトリ内にあります。
src/database/seeds/UserSeeder.php
:::

<br>

- Factoryファイル
Modelファイル、Seederファイルと同様にFactory用のコマンドが用意されているので作成します。
```terminl:terminal
php artisan make:factory UserFactory
```
:::note info
artisanコマンドで作成されたものは以下のディレクトリ内にあります。
src/database/factories/UserFactory.php
:::

### ①Modelファイルでの設定
初期状態のModelファイルは以下のようになっています。
```php:User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    //
}
```

Modelをテーブルと対応させる(今回はUserListテーブル)必要があるので以下を編集します。

```php:User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // ここに対応させるテーブル名記載する
    protected $table = 'UserList';
}
```

### ②Seederファイルでの設定
初期状態のSeederファイルは以下のようになっています。
```php:UserSeeder.php
<?php

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}
```

run()の中にはfactory()を利用して、factoryを使用することを明示する必要があります。

```php:UserSeeder.php
<?php

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //第一引数に対応させるModel名を記載する
        //第二引数はテストデータの個数を指定(今回は1000件のレコードを作成してくれる)
        factory(App\User::class, 1000)->create();
    }
}
```

### ③Factoryファイルでの設定
Facctoryファイルでは新たにFakerというクラスが出てきます。まずはFakerについて見ていきたいと思います。
#### Fakerとは
Fakerとはテストデータを作ってくれる優れものです。Fakerの説明も外部の記事が非常にわかりやすくまとめられているのでこちらをご覧ください。

https://qiita.com/kitajii/items/1c9ca497ff40fd67dae1

<br>

初期状態のFactoryファイルは以下のようになっています。
```php:UserSeeder.php
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Model;
use Faker\Generator as Faker;

$factory->define(Model::class, function (Faker $faker) {
    return [
        //
    ];
});

```

$fakerの後に続くアロー演算子(->)には特定のメソッドを記載する必要があります。
記載する内容をきれいにまとめてくれている記事があるので[こちら](https://qiita.com/tosite0345/items/1d47961947a6770053af)をご覧下さい。


```php:UserSeeder.php
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

//自分が設定したModelの名前に変更
use App\User;
use Faker\Generator as Faker;

//第一引数は自分が設定したModelの名前に変更
$factory->define(User::class, function (Faker $faker) {
    return [
        //UserListテーブルの項目とそれぞれの項目へのテストデータの設定を記入
        'name' => $faker->unique()->name(),
        'age' => $faker->unique()->numberBetween(0, 100),
        'tel_num' => $faker->unique()->phoneNumber(),
        'mail' => $faker->unique()->email(),
    ];
});

```

### 実行
ここまで設定ができたらあとは実行するだけです。
```terminal:terminal
//ロードして
composer dump-autoload

//キャッシュを消して
php artisan config:cache
php artisan config:clear

//seederを実行
php artisan db:seed
```

サンプルデータが1000件作成されていれているはずです。


# おわりに
Laravelにはいくつもバージョンがあり、バージョンによってはソースコードの記入方法が違います。今回はバージョン6のときの書き方です。現在（2024/5/19）はLaravel9が登場しており、Factoryのコードの書き方も違ってきます。Laravel6を使用している方で、参考にしていただければ幸いです。また、初学者のため、間違えた書き方をしている可能性があります。「もっとこんな書き方があるよ」という方がいればご教授いただければと思います。

# 参考文献
https://arc.net/l/quote/reccqgbp

https://qiita.com/3y9Mz/items/bead12cdab34a5ebe69f

https://qiita.com/kitajii/items/1c9ca497ff40fd67dae1

https://qiita.com/tosite0345/items/1d47961947a6770053af