【Laravel】ダミーデータ作成【Models, factories, seeders】

## ダミーデータを生成する意味とは
データベースへ接続し、テーブルを作成したらテスト用データを作成したくなるかと思います。
ですが直接挿入するのはテストの一貫性が担保されません。
そこで簡単に一貫性のあるデータを流し込むことができる方法について紹介いたします。
※本記事は Laravel sail を使用し環境構築をしている想定です。

## モデルの作成
| 物理名 | 論理名 |
| ------------- | ------------- |
| id | ID |
| name | 名前 |
| user_id | ユーザー識別ID |
| url | URL |
| remark | 備考 |
| created_at | 作成日時 |
| updated_at | 更新日時 |

今回は例として上記のようなカラムを持つテーブル tests とやり取りするためのモデルファイルとファクトリーを作成します。
```
sail artisan make:model Test -f
```
こちらのコマンドにより app/Models フォルダ内に Test.php が生成されます。
このとき `use HasFactory;` 配下に必要に応じて以下のように `$fillable` を記載してください、
```
    protected $fillable = [
        'name',
        'status',
        'remark'
    ];
```
Laravel ではデフォルトでデータ大量挿入からデータベースを保護する仕組みがあります。
`$fillable` を記載し大量割り当てを許可するカラムを指定しましょう。

こちらの記事が具体的なイメージをつかむ参考になりました！
https://qiita.com/monji586/items/58d91891caa51b514166


## ファクトリーの作成
ファクトリーとはモデルを利用したダミーデータやテストデータを作ることができる機能のことです。
先ほどモデルを作成した際のコマンドに `-f` オプションをつけているので database/factories フォルダ内に TestFactory.php が同時に作成されています。

まずはモデルとファクトリーを繋ぎ込むために下記のように `protected $model` を宣言しましょう。
```
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    protected $model = Test::class;
```
その後 `definition()` 内にどのようにダミーデータを生成するか記載しましょう。
このとき fake ヘルパを使うと、ファクトリでさまざまな種類のランダムデータを生成できます。
```
    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'user_id' => 1,
            'url' => fake()->url(),
            'remark' => fake()->realText(30)
        ];
    }
```
fake ヘルパについてはこちらを参考にしました！
https://github.com/nshiro/faker-summary

実装後の TestFactory.php は全体としてこのようになります。
```
<?php

namespace Database\Factories;

use App\Models\Test;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Test>
 */
class TestFactory extends Factory
{
    /**
     * このファクトリに対応するモデル名
     *
     * @var class-string<\Illuminate\Database\Eloquent\Model>
     */
    protected $model = Test::class;

    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'user_id' => $this->faker->randomNumber(100),
            'url' => fake()->url(),
            'remark' => fake()->realText(30)
        ];
    }
}
```
このコードでは以下のように生成を指示しています。
・名前
・100 までの乱数
・URL
・30 文字のテキスト

## シーダーの作成とダミーデータ挿入
プログラミングにおけるシード（シーディング）とは、テストのためにデータベースにランダムなダミーデータを挿入することを意味します。

シーダーファイルの作成は下記のコマンドを実行します。
```
sail artisan make:seeder TestSeeder
```
成功後 database/seeders フォルダ内に TestSeeder.php ファイルが作成されます。

run 関数内に以下のコードを追加してください。
```
Test::factory(10)->create();
```
こちらのコードにより Test モデルに繋ぎ込み、TestFactory 内の definition 関数を実行し 10 件のダミーデータを作成するように指示しています。

このままでも実行できますがまとめて複数のテーブルのデータを生成できるように設定しましょう。
デフォルトで生成されている DatabaseSeeder 内の call メソッドを用いて以下のように記載しましょう。

```
/**
 * データベースに対するデータ設定の実行
 */
public function run(): void
{
    $this->call([
        TestSeeder::class,
    ]);
}
```

ここまで設定できたらシーダーを実行し、データを挿入してみましょう。
DatabaseSeeder に記載しているシーダーを全て実行する場合は
```
sail artisan db:seed
```
特定のシーダーを実行する場合は
```
sail artisan db:seed --class=TestSeeder
```
のようにコマンドを実行し、下記のように返ってくれば成功です！
お疲れ様でした！
![スクリーンショット 2024-06-19 23.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1240509/72ab9c83-9ed0-b301-5ecc-be2169e4ddac.png)