laravel Seeder（シーダー）を使ってみる

## 目的

- laravelでSeeder（シーダー）を使う方法をまとめる。

## 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 8.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |
| Node.jsバージョン | v12.14.1 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでNode.jsをインストールする](https://qiita.com/miriwo/items/73d1546220f1c091a7d5) |

## 情報

- limitsというテーブルが存在し、下記のようなカラムの設定になっているとする。

    ```sql
    mysql> show full columns from limits;
    +------------+-----------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
    | Field      | Type            | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
    +------------+-----------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
    | id         | bigint unsigned | NULL               | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
    | name       | varchar(255)    | utf8mb4_unicode_ci | NO   |     | NULL    |                | select,insert,update,references | 期限    |
    | created_at | timestamp       | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
    | updated_at | timestamp       | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
    | deleted_at | timestamp       | NULL               | YES  |     | NULL    |                | select,insert,update,references |         |
    +------------+-----------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
    ```

- limitsテーブルのnameカラムが「今日中」「明日中」「今週中」「今月中」「未定」となるレコードを追加したいとする。
- 今回の方法で紹介するコマンドは特筆しない限り前のコマンドと同じディレクトリで実行するものとする。

## 方法

1. アプリ名ディレクトリで下記コマンドを実行してSeederのファイルを作成する。

    ```terminal
    $ php artisan make:seeder LimitTableSeeder
    ```

1. 下記コマンドを実行して作成したSeederファイルを開く。

    ```terminal
    $ vi database/seeders/LimitTableSeeder.php
    ```

1. 開いたSeederファイルを下記のように修正する。

    ```アプリ名ディレクトリ/database/seeders/LimitTableSeeder.php
    <?php
    
    namespace Database\Seeders;
    
    use Illuminate\Database\Seeder;
    use Carbon\Carbon;
    use Illuminate\Support\Facades\DB;
    
    class LimitTableSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            $limit_names = [
                '今日中',
                '明日中',
                '今週中',
                '今月中',
                '未定',
            ];
    
            $now = Carbon::now();
            foreach ($limit_names as $limit_name) {
                $limit_info = [
                    'name' => $limit_name,
                    'created_at' => $now,
                    'updated_at' => $now,
                ];
                DB::table('limits')->insert($limit_info);
            }
        }
    }
    ```

1. 下記コマンドを実行して作成したSeederを登録するファイルを開く。

    ```terminal
    $ vi database/seeders/DetabaseSeeder.php
    ```

1. 下記のように内容を追記する。

    ```アプリ名ディレクトリ/database/seeders/DetabaseSeeder.php
    <?php
    
    namespace Database\Seeders;
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends Seeder
    {
        /**
         * Seed the application's database.
         *
         * @return void
         */
        public function run()
        {
            // \App\Models\User::factory(10)->create();
            $this->call(LimitTableSeeder::class);
        }
    }
    ```

1. 下記コマンドを実行してシーディングの実行を行う。

    ```terminal
    $ php artisan db:seed
    ```

1. MySQLにログインしlimitsテーブルを確認したところ下記のように表示されたため正常にSeederで登録指示したファイルが正常にシーディングされたことがわかる。

    ```sql
    mysql> select * from limits;
    +----+-----------+---------------------+---------------------+------------+
    | id | name      | created_at          | updated_at          | deleted_at |
    +----+-----------+---------------------+---------------------+------------+
    |  1 | 今日中    | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL       |
    |  2 | 明日中    | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL       |
    |  3 | 今週中    | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL       |
    |  4 | 今月中    | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL       |
    |  5 | 未定      | 2021-03-13 12:00:03 | 2021-03-13 12:00:03 | NULL       |
    +----+-----------+---------------------+---------------------+------------+
    5 rows in set (0.00 sec)
    ```

## 追記

- 「production環境では動作しないseederにしたい」場合などは下記のように記載すればよい気がする。

    ```アプリ名ディレクトリ/database/seeders/DetabaseSeeder.php
    <?php
    
    namespace Database\Seeders;
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends Seeder
    {
        /**
         * Seed the application's database.
         *
         * @return void
         */
        public function run()
        {
            if (!(config('app.env') === 'production')) {
                $this->call(LimitTableSeeder::class);
            }
        }
    }
    ```