[Laravel]マイグレーション（migration）・シーダー(seeder)まとめ

## はじめに
今まで学習してきたことを、自分なりにまとめていきます。

## マイグレーション（migration）
マイグレーションとは、データベースのテーブル作成や編集などを管理する方法です。
1つのテーブルを作成するのに必要なマイグレーションファイルは1つ必要になります。

https://readouble.com/laravel/10.x/ja/migrations.html

### ①マイグレーションファイルの作成
Laravel Sailで開発環境を構築しているので、下記のようなコマンドを実行し、マイグレーションファイルを作成します。
```
$ ./vendor/bin/sail php artisan make:migration create_テーブル名(名詞の複数形)_table
```
:::note info
Laravel Sailで開発環境を構築した場合は./vendor/bin/sail php artisanとなるので注意してください。
:::
:::note info
テーブル名のところは作成するテーブル名を複数形で入力してください。
:::

### ②マイグレーションファイルの構成
Laravelのバージョンによっても異なりますが、デフォルトで下記のマイグレーションファイルが存在します。

- 2014_10_12_000000_create_users_table.php
- 2014_10_12_100000_create_password_resets_table.php
- 2019_08_19_000000_create_failed_jobs_table.php
- 2019_12_14_000001_create_personal_access_tokens_table.php

これらデフォルトで存在するマイグレーションファイルのほとんどは、ログイン機能を実装する場合などに使用します。

### ③マイグレーションファイルの記述
マイグレーションファイルを使用してカラムを追加する場合、基本$table->カラムタイプ('カラム名')という形でカラム定義を記述します。

ちなみに利用可能なカラムタイプは[ドキュメント](https://readouble.com/laravel/10.x/ja/migrations.html)に一覧が載っているので、参照してみてください。
※バージョンの違い等で利用可能なカラムは変わる場合もあります。

```ruby:記述例
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('テーブル名', function (Blueprint $table) {
            $table->id();
            $table->string('title', 100); // ここを追加
            $table->text('content');      // ここを追加
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');
    }
};
```

 **$table->string('title', 100);** とすることでtitleというカラム名の100文字という文字数制限があるカラムを生成します。
**$table->text('content');** とすることでcontentというカラム名の文字数制限がないカラムを生成します。

### ④マイグレーションの実行
記述が終わったら、下記コマンドでマイグレーションの実行をしていきましょう。
```
$ ./vendor/bin/sail php artisan migrate
```
実行が成功したら、[phpMyAdmin](http://localhost:8888/)へアクセスして、データベースにテーブルが作成されていると思います。

### 補足
未処理のマイグレーションをすべて実行するには、migrate Artisanコマンドを実行します。
```
./vendor/bin/sail php artisan migrate
```

データベースからすべてのテーブルを削除したあと、migrateコマンドを実行します。
```
./vendor/bin/sail php artisan migrate:fresh
./vendor/bin/sail php artisan migrate:fresh --seed
```

すべてのマイグレーションをロールバックしてから、migrateコマンドを実行します。このコマンドは、データベース全体を効果的に再作成します。
```
./vendor/bin/sail php artisan migrate:refresh
./vendor/bin/sail php artisan migrate:refresh --seed
```

## シーダー(seeder)
シーダーとは、データベースにテストデータを作成するための機能です。

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

### ①シーダーファイルの作成
シーダーファイルもマイグレーションファイル同様、コマンドで作成することができます。
下記コマンドを実行してください。
```
$ ./vendor/bin/sail php artisan make:seeder テーブル名TableSeeder
```
:::note info
テーブル名の1文字目は大文字にしてください。
:::

### ②シーダーファイルの記述
記述したテーブル名のテーブルへデータを追加する場合、DB::table('テーブル名')->insert([追加するデータ群]);という形でカラム定義を記述します。

```ruby:記述例
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // ここを追加

class テーブル名TableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // --- ここから追加 ---
        DB::table('テーブル名')->insert([
            'title' => 'タイトル１',
            'content' => 'テストデータ１',
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s'),
        ]);

        DB::table('テーブル名')->insert([
            'title' => 'タイトル２',
            'content' => 'テストデータ２',
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s'),
        ]);

        DB::table('テーブル名')->insert([
            'title' => 'タイトル３',
            'content' => 'テストデータ３',
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s'),
        ]);
        // --- ここまで追加 ---
    }
}
```

### ③シーダーファイルの登録
作成したシーダーファイルは、実行するためにDatabaseSeeder.phpへ登録することが必要です。

登録の仕方は下記の通り編集してください。
```ruby:database/seeders/DatabaseSeeder.php
<?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(テーブル名TableSeeder::class); // ここを追加
        // \App\Models\User::factory(10)->create();

        // \App\Models\User::factory()->create([
        //     'name' => 'Test User',
        //     'email' => 'test@example.com',
        // ]);
    }
}
```

### ④シーダーファイルの実行

記述が終わったら、下記コマンドでシーダーファイルの実行をしていきましょう。
```
$ ./vendor/bin/sail php artisan db:seed
```
実行が成功したら、[phpMyAdmin](http://localhost:8888/)へアクセスして、データベースにテストデータが登録されていると思います。

## コマンドまとめ
この記事に載せてあるコマンド一覧です。

```:マイグレーションファイルの作成
$ ./vendor/bin/sail php artisan make:migration create_テーブル名(名詞の複数形)_table
```

```:マイグレーションの実行
$ ./vendor/bin/sail php artisan migrate
```

```:未処理のマイグレーションをすべて実行
./vendor/bin/sail php artisan migrate
```

```:すべてのテーブルを削除したあと、migrateコマンドを実行
./vendor/bin/sail php artisan migrate:fresh
./vendor/bin/sail php artisan migrate:fresh --seed
```

```:すべてのマイグレーションをロールバックしてから、migrateコマンドを実行
./vendor/bin/sail php artisan migrate:refresh
./vendor/bin/sail php artisan migrate:refresh --seed
```

```:シーダーファイルの作成
$ ./vendor/bin/sail php artisan make:seeder テーブル名TableSeeder
```

```:シーダーファイルの実行
$ ./vendor/bin/sail php artisan db:seed
```
## さいごに
いかがだったでしょうか。

他にもいろいろな記事を書いているのでぜひ読んでいただけたら嬉しいです。