LaravelでFactoryとSeederを使ってデータを登録する

## はじめに
今回はLaravelでFactoryを使ってSeederでDBに大量にデータを登録していく。
テストだったりである程度データが必要な場合などに非常に便利な機能。

## 実際の使い方
### Factoryを作成
Laravelのartisanコマンドを使って、Factoryを作っていきます。
今回は`TrRecordFactory`を作っていきます。
```
CA8775:toreka_project 01048656$ php artisan make:factory TrRecordFactory
```



### Factoryファイルを編集
コマンドを打つと今回の場合`database\factories\TrRecordFactory.php`ファイルが作成されるのでそれを編集していきます。
```TrRecordFactory.php
<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
// 追記
use App\Models\User;
use App\Models\TrRecord;


/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\TrRecord>
 */
class TrRecordFactory extends Factory
{
    /**
     * 追加
     * モデルに対応したファクトリの名前
     *
     * @var string
     */
    protected $model = TrRecord::class;

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        return [
            // 追加
            'user_id' => User::factory(),
            'part' => '胸',
            'menu' => 'ベンチプレス',
            'set_type' => 'ノーマルセット',
            'weight_first' => 100,
            'reps_first' => 10,
        ];
    }
}

```
大きく3箇所いじっていきます。
1つ目はuse文を使ってmodelを使えるようにしましょう。
```
use App\Models\User;
use App\Models\TrRecord;
```

2つ目はモデルに対応したファクトリの名前を記述してあげます。
```
protected $model = TrRecord::class;
```

3つ目はreturn文の中に今回入れるデータの中身を書いていきます。
```
return [
            // 追加
            'user_id' => User::factory(),
            'part' => '胸',
            'menu' => 'ベンチプレス',
            'set_type' => 'ノーマルセット',
            'weight_first' => 100,
            'reps_first' => 10,
        ];
```
これでFactoryファイルはOKです。

### Modelを編集
HasFactoryトレイトを使うようにしておく必要があるため、Modelに一文追加しましょう。
```TrRecord.php
class TrRecord extends Model
{
    use HasFactory;
}
```

### Factoryのdefinitionメソッドを修正する
配列形式でカラムに対応する値を書いていきます。

```TrRecordFactory.php
public function definition()
    {
        return [
            // 追加
            'user_id' => User::factory(),
            'part' => '胸',
            'menu' => 'ベンチプレス',
            'set_type' => 'ノーマルセット',
            'weight_first' => 100,
            'reps_first' => 10,
        ];
    }
```
### TrRecordSeederを作成する
下記コマンドを打ち込みSeederファイルを作成する。
```
 CA8775:toreka_project 01048656$ php artisan make:seeder TrRecordSeeder
```

このような感じのファイルが作成されるので、対応するモデルを使えるように`use文`を記載。
また`runメソッド`内に下記のような感じで記載をする。
今回はUserモデルとTrRecordモデルにそれぞれデータを登録するため、下記のような感じで書く。
```TrRecordSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\TrRecord;

class TrRecordSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        User::factory()->has(TrRecord::factory(10))->create();
    }
}
```

### SeederでFactoryを使用する
作成したFactoryを使用するように、`database/seeders/DatabaseSeeder.php`に記載します。
```DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(TrRecordSeeder::Class);
    }
}

```
### Seederを実行する
```
root@4cd878229358:/work/backend# php artisan db:seed
Seeding: Database\Seeders\TrRecordSeeder
Seeded:  Database\Seeders\TrRecordSeeder (5,418.16ms)
```

これでデータを登録することができました。
基礎的な注意点として、上記コマンド`php artisan db:seed`を打つときはコンテナ内でやりましょう。
そうしないとエラーが起きて登録ができません。
僕自身何度も引っかかっているので要注意です。。

以上