待って、factory()ってめっちゃ便利やん

## はじめに
Laravelでテストレコードを作りたい時、いちいちモデルに適当な値を代入するのは煩雑だなと思っていました。

しかしfactory()を使えば、自動で適当な値をカラムに代入してテストレコードを作成してくれます。

経験者からすると「あたりまえやん！！」となるかもですが、ちょっと感動したのでまとめてみます（笑）

## 環境
Laravel 9.52.16

## 問題
* 動作確認のためのテストレコードを作りたい
* しかしカラムが多く、いちいち代入するのは時間がかかる

```sql
mysql> desc users;
+-------------------+-----------------+------+-----+---------+----------------+
| Field             | Type            | Null | Key | Default | Extra          |
+-------------------+-----------------+------+-----+---------+----------------+
| id                | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| name              | varchar(255)    | NO   |     | NULL    |                |
| email             | varchar(255)    | NO   | UNI | NULL    |                |
| email_verified_at | timestamp       | YES  |     | NULL    |                |
| password          | varchar(255)    | NO   |     | NULL    |                |
| remember_token    | varchar(100)    | YES  |     | NULL    |                |
| created_at        | timestamp       | YES  |     | NULL    |                |
| updated_at        | timestamp       | YES  |     | NULL    |                |
+-------------------+-----------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
```

たとえば上記のようなテーブル構成のモデルインスタンスを作ろうとすると、

少なくともNullがNoとなっているname, email, passwordに何らかの値を代入しなければいけません。

```php: Tinker上
use App\Models\User;

$user = User::create([
    'name' => 'テスト',
    'email' => 'example@example.com',
    'password' => bcrypt('password'),
);
```

## 解決策
* factory()メソッドを使う
```php: Tinker上
use App\Models\User;

$user = User::factory()->create();
```

上のコードを実行するとなんということでしょう。

```php: 出力結果（一部省略）
> $user = User::factory()->create();
[!] Aliasing 'User' to 'App\Models\User' for this Tinker session.
= App\Models\User {#7297
    name: "Mylene Haley",
    email: "wellington.blick@example.com",
    email_verified_at: "2024-00-00 00:00:00",
    password: "xxxxxxxxxxx",
    updated_at: "2024-00-00 00:00:00",
    created_at: "2024-00-00 00:00:00",
    id: 3,
  }
```

このように自分で属性を設定せずとも、factory()メソッドが自動で適当な値を設定してくれます。

また、複数のテストレコードを作成したい時はtimes()メソッドをチェーンします。

```php: Tinker上
use App\Models\User;

// 5つのインスタンスを生成
$user = User::factory()->times(3)->create();
```

```php: 出力結果
> $user = User::factory()->times(3)->create();
= Illuminate\Database\Eloquent\Collection {#7348
    all: [
      App\Models\User {#7344
        name: "Mr. Beau Rempel Jr.",
        email: "reba.turcotte@example.net",
        email_verified_at: "2024-00-00 00:00:00",
        password: "xxxxxxxxxxx",
        updated_at: "2024-00-00 00:00:00",
        created_at: "2024-00-00 00:00:00",
        id: 4,
      },
      App\Models\User {#7268
        name: "Ciara Cassin",
        email: "boehm.kyla@example.com",
        email_verified_at: "2024-00-00 00:00:00",
        password: "xxxxxxxxxxx",
        updated_at: "2024-00-00 00:00:00",
        created_at: "2024-00-00 00:00:00",
        id: 5,
      },
      App\Models\User {#7346
        name: "Prof. Issac Toy",
        email: "shills@example.com",
        email_verified_at: "2024-00-00 00:00:00",
        password: "xxxxxxxxxxx",
        updated_at: "2024-00-00 00:00:00",
        created_at: "2024-00-00 00:00:00",
        id: 6,
      },
    ],
  }
```

このように、ものの一行で複数のテストレコードを作成することもできます。

## おわりに
今までfactory()を知らずに自力でテストレコードを作成していました。

なのでfactory()を見つけた時は「おおーーーっ」となりましたよね。

めちゃくちゃ便利なので、テストのときはこれから何度もお世話になりそうです。