LaravelでChatGPTを用いて本番っぽいデータを生成する効率のよい方法


## はじめに
現在スキルの売買系の案件の開発をしているのですが、ある程度コアな機能が完成して動作確認を社長としていたとき、

**「これ文言適当だとクライアントが確認するときにサービスの使い方想像しづらいでしょ！」と**言われました。

確かに現状のファクトリーで生成したデータ「サービス紹介：荒く火　なんだよなにし　えおいあえい」みたいになってて、実際にサービスを使ったときの状態が分かりづらいです。

そこでデータの中身を実際にサービスを使っている人が使ってそうな文言に変えることにしました。

とはいえテーブルもそこそこたくさんある状態で、１からそれっぽい文章を書くのがめちゃくちゃ面倒だったので、なんとかChatGPTに任せられないかと考えました。

**※今回はFactoryを用いています。FactoryとSeederについては解説しません**
**※前提としてマイグレーションファイルとモデルは既にあるものとします**


## まとめ
1. サービスの方向性とこれから実行してほしい内容伝える
2.  ChatGPTにマイグレーションファイルを貼って、生成してほしいデータを指定する
3. 生成された内容をFactoryに貼り付けて実行

## 1. サービスの方向性とこれから実行してほしい内容伝える

例えばスキルの売買をする系で、適当に楽器を持っている人と楽器の整備をする人のマッチングサービスを考えましょう。以下のように入力します。

```
Laravelを用いて、「楽器をもっている人と整備する人のマッチングサービス（この部分はアレンジする）」を作っています。
顧客に見せるタイミングが近くなってきたため、データを実際のサービスに出てきそうな感じにしたいと思います。
例えばサービスの名前をきめるときは、今まではfakerを用いて適当な文字列を生成していましたが、
それを「あなたの楽器を新品同様に蘇らせます！（この部分はアレンジする）」のような実際にありそうなサービス名に変更したいと思います。

方針としてはマイグレーションファイルを貼り付けるので、fakerと組み合わせてデータを生成してほしいです。
いくつかバリエーションが必要なデータを挙げるので、そのデータはあなたがカスタムしてもらい、
それ以外は通常のfakerでデータを作成してください。Factoryファイルで生成規則を決めてください。
次の質問からマイグレーションファイルを貼り付けていきます。
```

自分で考えるところは以下の通りです
**- サービスの方向性について(「楽器をもっている人...」の部分）**
**- 本番で使いそうな具体的なデータ内容一つ(「あなたの楽器を...」の部分)**

他の内容はコピペすれば大丈夫です。

### 出力結果
![スクリーンショット 2023-06-26 5.53.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77737/d8d964e0-923f-fa0b-7a58-502b98524962.png)

## 2. マイグレーションファイルを貼って、生成してほしいデータを指定する
マイグレーションファイルを見て、**生成してほしいデータを指定**します。
例えばdisplay_nameとかはただの名前じゃなくて、サービスの方向性に合った名前にしたいので、display_nameを指定します。
後は**マイグレーションファイルを貼り付けるだけ**です。

```
生成してほしいデータ:display_name,introduction

Schema::create('mechanics', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('display_name')->nullable();
            $table->string('email')->unique();
            $table->string('password')->nullable();
            $table->string('image')->nullable();
            $table->text('introduction')->nullable();
            $table->string('phone_number')->nullable();   
            $table->integer('experience')->nullable();
            $table->timestamps();
        });
```

自分で考えるところは以下の通りです

**- 生成してほしいデータ**

### 出力結果

![スクリーンショット 2023-06-26 6.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77737/d9f00bfe-eef4-033d-cd12-ffc7446a6c1f.png)


生成してほしい以外のデータ（nameとかimage）を貼り付ける意味ですが、他のデータも貼り付けることでそのデータにほしい情報がより正確になる気がします。
例えばnameとdisplay_nameがあると、nameが本名でdisplay_nameがお客さんに見せる名前だと理解してくれるので、よりサービスの方針に沿った名前になるのでは...と思います。
正確に検証したわけではないので完全に予想です。

なにより最大のメリットとしては**そのまま貼り付けるだけなのでめちゃくちゃ楽**です。

## 3. 生成された内容をFactoryにはりつける
2で生成された出力結果をFactoryファイルにそのまま貼り付けます。
あとは実際にデータベースを作成するだけです。
```DatabaseSeeder.php
public function run()
{
    Mechanic::factory(10)->create();
}
```
実行します
```
php artisan db:seed
```
これでデータベースが作成されたはずです

## 他の出力例
```serviceテーブル
生成してほしいデータ:name,detaild_description

Schema::create('services', function (Blueprint $table) {
            $table->id();
            $table->foreignId('mechanics_id')->constrained('teachers')->onDelete('cascade');
            $table->string('name');
            $table->string('price');
            $table->text('detailed_description');
            $table->string('tagline')->nullable();
            $table->string('image')->nullable();
            $table->timestamps();
        });
```

### 出力結果
![スクリーンショット 2023-06-26 6.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77737/99fbfd85-5c3d-924d-1160-aefe02a4aa54.png)

### 備考
このままデータを生成すると、serviceをもたないmechanicが生成されてしまいます。
全てのmechanicがserviceを持ってほしいので、mechanicを生成した後それに関連づいたserviceを作れるようにMechanicFactoryに下記を追加します。

```MechanicFactory.php
public function configure()
{
    return $this->afterCreating(function (Mechanic $mechanic) {
        Service::factory()->create(['mechanic_id' => $mechanic->id]);
    });
}
```


## この方法の良いところ

- 自分で考えるところが少なく、ほぼ貼り付けるだけなので、とても楽
- データの関連までChatGPTが考えてくれるので、わりとほしいデータの方向性になる