Laravelでダミーデータ作成

# はじめに
30代公務員がエンジニア目指して勉強中。
備忘録として、Laravelを使用したダミーデータ作成についてまとめた。

## シーディングファイルの作成
シードを作成するためのスクリプトファイルを生成する

```:PHPコンテナ内
php artisan make:seeder TodoTableSeeder
php artisan make:seeder CategoryTableSeeder
```

## ファクトリの作成
ファクトリで作るデータの定義を作成する
```:PHPコンテナ内
php artisan make:factory TodoFactory
php artisan make:factory CategoryFactory
```
以上コマンドを実行で、database/factoriesディレクトリ以下にファイルが作成される。

それぞれ作成されたファイル内の definiton メソッドの中の[　]内にデータの定義をしていく。
```php:CategoryFactory.php
<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Category;

class CategoryFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->word(),
        ];
    }
}
```
↑ name カラムに対して、ランダムな単語を作成してもらう。


```php:TodoFactory.php
<?php

namespace Database\Factories;

use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Todo;

class TodoFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'content'=>$this->faker->text(5),
            'category_id'=> Category::inRandomOrder()->first()->id;
            },
        ];
    }
}
```
↑ content カラムには最大文字数(5)のテキストを生成。category_id カラムは外部キー制約があるためCategoryテーブルのid カラムを参照する。

なお、faker メソッドについて一部まとめた。
| メソッド名 | 機能 |
|:-|:-|
| randomNumber()  | 整数値をランダムに返す  |
| numberBetween(最小値,最大値) | 引数で指定した範囲内からランダムに整数を返す  |
| randomLetter()  | ランダムな文字(アルファベット)を返す  |
| word()  | ランダムな文字(英単語)を返す  |
| text(文字数)  | 引数に指定した最大文字数のテキストを生成して返す  |
| sentence()  | センテンス(一文)をランダムに生成して返す  |
| emoji  | 絵文字をランダムに返す  |
| name()  | 名前をランダムに返す  |
| country()  | 国名をランダムに返す  |
| state()  | ステート(州)をランダムに返す|
| city() | 町の名前をランダムに返す |
| date() | 日付(年月日)のテキストをランダムに返す |
| safeEmail() | メールアドレスのテキストをランダムに返す |
| password() | パスワードのテキストをランダムに返す |

## ファクトリのシーダーへの設定
それぞれ作成した Seeder ファイル内のrun( ){ } 内に記述していく
```php:CategoriesTableSeeder.php
<?php

namespace Database\Seeders;

use App\Models\Category;
use Illuminate\Database\Seeder;
use illuminate\Support\Facades\DB;

class CategoriesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Category::factory()->count(10)->create();
    }
}
```
↑ Category モデルを利用してEloquent からファクトリを呼び出している
count メソッドの引数でデータを生成する個数が決定される


```php:TodosTableSeeder.php
<?php

namespace Database\Seeders;

use App\Models\Todo;
use Illuminate\Database\Seeder;
use Illuminate\Support\facades\DB;

class TodosTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Todo::factory()->count(20)->create();
    }
}
```
↑ Todo モデルを利用してEloquent からファクトリを呼び出している

## DatabaseSeederにシーダーを設定する
シーダーを DatabaseSeeder に登録する
```php:DatabaseSeeder.php
<?php

namespace Database\Seeders;

use App\Models\Category;
use App\Models\Todo;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(CategoryTableSeeder::class);
    }
}
```
シーダーの登録ができたら、シーディングを利用する
```:PHPコンテナ内
php artisan migrate:fresh (必要であれば)
php artisan db:seed
```

# まとめ
外部キー制約のあるカラムのダミーデータ作成について、知識が浅くしばらく悩んだ。
エラーは嫌だけど、エラー解消の瞬間が一番気持ちいいかもしれない。