Laravel 10.x ダミーデータ作成(Factory使用)

# はじめに
私は、HTML、CSS、JavaScript(React,Next)を少しだけかじったことがある程度から、今回初めてフルスタックフレームワークのLaravelを学びました。
MVCモデルにそった開発は、頭の中がすっきりとわかりやすく、すごいなぁと感じることができていました。その中で、ダミーデータを生成してくれる？ダミーデータ？シーダー？ファクトリー？そんな便利なものまであるの？というなぞに包まれた便利機能。
まったくそのようなものが世の中にあるとも想像してないかったため、利用する上で少し困惑が多かったので備忘録として利用の流れをまとめておこうと思いました。
もっと効率的なダミーデータ生成もあるのかと思いますが、初学者の思い出話と見届けて頂けたらと思います。

## 単一データの挿入(seeder利用)
1. seederクラスの作成

```php
php artisan make:seeder 作成したいシーダー名Seeder
```

2.作成されたseederクラスに、クエリビルダーを使用するためのDBモデルとパスワードをデータ挿入する場合は、ハッシュ化が必要なためHasuモデルをuseする必要がある

```php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
```

3.Seederモデルのrun関数に挿入したいダミーデータを記述する

```php
class User extends Seeder{
	@return void;
	public function run(): void
    {
        DB::table('挿入したいテーブル名')->insert([
            [
                'name' => 'ysk',
                'email' => 'ysk@example.com',
                'password' => Hash::make('password'),
            ]
        ]);
    }
```

4.DatabaseSeeder.phpで追加したいseederファイルを呼び出す必要がある

```php
public function run(): void
{
    $this->call([
        UserSeeder::class,
    ]);
}
```

5.マイグレーションの実行

このコマンドを実行すると、過去に作成されたテーブルを削除してテーブル再作成と同時にダミーデータを挿入する

```php
php artisan migrate:fresh -seed
```

## 複数データの挿入(factory利用)
- 複数(多数の)データを挿入
    [Eloquent:ファクトリ 10.x Laravel](https://readouble.com/laravel/10.x/ja/eloquent-factories.html)
    
    1. Factoryクラスを作成する
        ```php
        php artisan make:factory 作成したいファクトリ名Factory
        ```
    
    2. ダミーデータの日本語設定
        config/app.phpファイルを変更する
        ```php
        'faker_locale' => 'ja_JP',
        ```
        
    3. ダミーデータ作成メソッドを利用して、カラムに対して適切なメソッドをfactoryファイルに設定する
        faker作成メソッド一覧
        [[2022年最新版] Laravel の開発に欠かせない Faker のチートシートを作ってみた](https://yukiyuriweb.com/2022/07/08/laravel-faker-cheat-sheet/)
        
        ```php
        //Userモデルのダミーデータの定義をする
        public function definition(): array
            {
                return [
                    'name' => fake()->name(),
                    'email' => fake()->unique()->safeEmail(),
                    'email_verified_at' => now(),
                    'password' => static::$password ??= Hash::make('password'),
                    'remember_token' => Str::random(10),
                ];
            }
        ```
        
        - 外部キー制約があるカラムに対するデータの挿入(1user、1post)
            
            ```php
            //PostFactpry.php
            //Postモデルのダミーデータの定義をする
            public function definition(): array
            {
            	return [
            		'title'=>fake()->realText(20),
            		'content'=>fake()->realText(300),
            		'user_id'=>User::factory()->create()->id,
            	];
            }
            
            //seederファイル
            use App\Models\Post;
            
            public function run(): void
            {
            	Post::factory->create(); //1データ作成
            	Post::factory->count(作成したい数)->create(); //複数データ作成
            }
            ```
            
        - 外部キー制約があるカラムに対するデータの挿入(1user、3post)(hasMany側の場合)
            
            ```jsx
            //UserモデルがPostモデルに対して、１対多(hasMany)を定義していると仮定
            //Postモデルのダミーデータの定義をする
            public function definition(): array
            {
            	return [
            		'title'=>fake()->realText(20),
            		'content'=>fake()->realText(300),
            	];
            }
            
            //seederファイル
            use App\Models\User;
            use App\Models\Post;
            
            public function run(): void
            {
            //1userが3postのダミーデータ１データ作成
            	$user = User::factory()
            		->has(Post::factory()->count(3))
            		->create();
            //1userが3postのダミーデータ複数データ作成
            	$user = User::factory()->count(作成したい数)
            		->has(Post::factory()->count(3))
            		->create();
            }
            ```
            
        - 外部キー制約があるカラムに対するデータの挿入(1user、3post)(belongTo側の場合)
            
            ```jsx
            //PostモデルがUserモデルに対して、１対多(belongTo)を定義していると仮定
            //seederファイル
            use App\Models\User;
            use App\Models\Post;
            
            public function run(): void
            {
            	for ($i = 0; $i < 30; $i++) {
                Post::factory()
                  ->count(3)
                  ->for(User::factory())
                  ->create();
                }
            }
            ```
            
        - 中間テーブルへダミーデータを紐付けしながらデータ挿入
            
            PostモデルデータとTagモデルデータが多対多であると仮定
            
            ```php
            //中間テーブルファクトリーファイル
            public function definition(): array
              {
            //PostとTagモデルダミーデータを事前に挿入してある状況から
                $post_id=Post::all()->random(1)[0]->id;
                $tag_id=Tag::all()->random(1)[0]->id;
                return [
                  'post_id'=>$post_id,
                  'tag_id'=>$tag_id,
                ];
              }
            ```
            
    4. artisanコマンドで実行
        
        ```php
        php artisan migrate:fresh --seed
        ```
        
## まとめ
ダミーデータ生成してテーブルにデータを挿入できてはいるけども、もっと違うやり方があるのでは？と思いながらの内容です。しかし一旦は自分自身で扱いたいダミーデータを作成することができたのでよしとしています。
かなり読みづらい構成になっておりますが、申し訳ありません...