Laravel sailでのmigrate簡易まとめ

## はじめに
Laravel sailでmigrateを行うケースについて簡単にまとめました。
sail環境以外でも、以下のコマンドの`sail`を`php`に読み替えてもらうと同様に動くと思います。

:::note
この記事は「[Laravelの教科書 (加藤じゅんこ)](https://www.socym.co.jp/book/1408 "Laravelの教科書バージョン10対応（加藤 じゅんこ） | 書籍 本 | ソシム")」の内容を一部参考にさせていただきました。

:::

## 新規テーブル作成時
### ①マイグレーションファイルを作成
マイグレーションファイルとモデルを同時に新規作成
`$ sail artisan make:model <モデル名> -m`

:::note
マイグレーションファイルのみ新規作成する場合はこちら
`$ sail artisan make:migration マイグレーションファイル名`
:::

### ②作成したマイグレーションファイルを編集
database\migrations内に作成されたマイグレーションファイルを開いて編集する
- upメソッドにはマイグレート実行時に行うことを、downメソッドにはマイグレートを取り消してロールバックする時に行うことを記述する
- テーブル新規作成時はdownメソッドが自動入力されているので、通常はupメソッドを編集するだけで良い
- カラムを追加する場合は`$table->データ型('カラム名')->カラム修飾子`の構文で記述する (データ型とカラム修飾子については後述)
<details><summary>サンプルコード (examplesテーブルを作成)</summary>

```php:2024_08_11_194424_create_examples_table.php
<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('examples', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('examples');
    }
};
```
</details>

### ③マイグレート実行
`$ sail artisan migrate`
- データベース内のmigrationsテーブルにマイグレートの実行記録が残る
- maigrationsテーブルのbatchカラムには何回目にマイグレートが行われたかが表示されている
- 後述するロールバックコマンドによって、batchごとにまとめてマイグレートを取り消すことができる

## 既存テーブル編集時
### ①テーブルに紐づいたマイグレーションファイルを作成
`$ sail artisan make:migration <マイグレーションファイル名> --table=<編集するテーブル名>`

### ②作成したマイグレーションファイルを編集
**カラム追加時**
- upメソッドにカラムを追加する処理を、downメソッドにカラムを削除する処理を記述する
- カラム削除にはdropColumnメソッドを使用する

<details><summary>サンプルコード (examplesテーブルにtest行を追加)</summary>

```php:2024_08_11_195920_add_test_column.php
<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('examples', function (Blueprint $table) {
            $table->string('test')->after('email');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('examples', function (Blueprint $table) {
            $table->dropColumn('test');
        });
    }
};
```
</details>

**カラム削除時**
- upメソッドにカラムを削除する処理を、downメソッドに削除をやり直す処理を記述する

<details><summary>サンプルコード (examplesテーブルからtest行を削除)</summary>

```php:2024_08_11_200411_delete_test_column.php
<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('examples', function (Blueprint $table) {
            $table->dropColumn('test');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('examples', function (Blueprint $table) {
            $table->string('test')->after('email');
        });
    }
};
```
</details>

**カラム名変更時**
- renameColumnメソッドを使用する
- このメソッドは第一引数のカラム名を第二引数の名称に変更する働きを持つ

<details><summary>サンプルコード (テストカラムの名称を変更する)</summary>

```php:2024_08_11_201948_change_test_column_name.php
<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('examples', function (Blueprint $table) {
            $table->renameColumn('test', 'try');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('examples', function (Blueprint $table) {
            $table->renameColumn('try', 'test');
        });
    }
};
```
</details>

**カラムのデータ型変更時**
- changeメソッドを使用する

<details><summary>サンプルコード (テストカラムのデータ型を変更する)</summary>

```php:2024_08_11_203551_change_test_column_type.php
<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('examples', function (Blueprint $table) {
            $table->text('test')->change();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('examples', function (Blueprint $table) {
            $table->string('test')->change();
        });
    }
};
```
</details>



### ③マイグレート実行
`$ sail artisan migrate`

## ロールバック
`$ sail artisan migrate:rolllback`
- batchごとにまとめてマイグレートを取り消す
- ロールバックによって消えたテーブルやカラムのデータも消えることに注意

## マイグレーションファイルで使う主なデータ型
| データ型 | DB内表記 | 詳細 |
|:-:|:-:|:-:|
| integer | INTEGER | 整数 |
| string | VARCHER | 短めの文字列 (約255文字まで) |
| text | TEXT | 長めの文字列 (約16,384文字まで) |
| foreignId |  | 外部キー |
| boolean | BOOLEAN | true/false |
| date | DATE | 日付 |
| datetime | DATETIME | 日付・時刻 |

## マイグレーションファイルで使う主なカラム修飾子
| 修飾子 | 詳細 |
|:-:|:-:|
| nullable() | NULL値を許容 |
| after('カラム名') | 指定したカラムの後に配置 |
| default('値') | 初期値を設定 |
| unique() | 重複値を認めない |

## おわりに
今後の学習で、役立ちそうなことを見つけた場合は記事を更新していく予定です。