seederを使って効率的にテストデータを作成する

## はじめに
Laravelで新しくテスト用データを作成する時、自分は今までその都度tinkerを起動し、手打ちで入力していました。

しかし用意されているSeederクラスを使えば、その必要はなかったようなので、今更ながら導入してみたいと思います。

https://readouble.com/laravel/6.x/ja/seeding.html

## 環境
Laravel 9.52.16

## 問題
* テスト用のレコードが欲しい！
* よし！ちょっと時間はかかるけど、tinkerで用意しよう

```terminal
root@:/var/www/html/niches# php artisan tinker
```

```php
> use User

> $user = new User();
[!] Aliasing 'User' to 'App\Models\User' for this Tinker session.
= App\Models\User {#7232}

> $user->create(['name' => 'Yuichiro', 'email' => 'test@gmail.com', 'password' => 'aiueo']);
= App\Models\User {#7278
    name: "Yuichiro",
    email: "test@gmail.com",
    #password: "aiueo",
    updated_at: "2024-01-11 19:24:18",
    created_at: "2024-01-11 19:24:18",
    id: 1,
  }
```

これでやっと1件のUserモデルインスタンスが保存されましたが、いかんせん手間がかかります。

例えば50件作成しようとなると、かなりの時間を要します。


## 解決法
* Laravelで用意されているSeederを活用します

```terminal
root@:/var/www/html/niches# php artisan make:seeder UserTableSeeder
```

これでdatabase/seeders/UserTableSeederが生成されました。

このUserTableSeederを以下のように書き換えます。

```php: database/seeders/UserTableSeeder
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => Hash::make('password'),
            'created_at' => now(),
            'updated_at' => now(),
        ]);
    }
}

```

そしてdatabase/seeders/DatabaseSeederを次のように書き換えます。

```php: database/seeders/DatabaseSeeder
<?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(UserTableSeeder::class);
    }
}

```

このようにSeederクラスを書き換えたら、実行するために以下のコマンドを実行します。

```terminal
root@:/var/www/html/niches# composer dump-autoload
```

そして以下のコマンドを実行すれば、データベースに初期値を設定できます。

```terminal
root@:/var/www/html/niches# php artisan db:seed
```

tinkerでちゃんと設定されているか確認してみると…

```php
root@:/var/www/html/niches# php artisan tinker

> use User

> User::all();
[!] Aliasing 'User' to 'App\Models\User' for this Tinker session.
= Illuminate\Database\Eloquent\Collection {#7245
    all: [
      App\Models\User {#7248
        id: 1,
        name: "9DVqJrSW0M",
        email: "H8y0Up5JIn@gmail.com",
        email_verified_at: null,
        #password: "$2y$10$97JTlimSXgzYjUIOqyRVxeOIbKNxccaBDvo9vfg25bCNYMenjOgRi",
        #remember_token: null,
        created_at: null,
        updated_at: null,
      },
    ],
  }
```

単体ではなく50件作成したい場合は、forループで回すと良いですね。

```php: database/seeders/UserTableSeeder
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
    for ($i = 0; $i < 50; $i++) {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => Hash::make('password'),
            'created_at' => now(),
            'updated_at' => now(),
        ]);
    }
}
}

```