【Laravel】初めてのマイグレーション

# migration とは
データベースの作成や編集、削除などをバージョン管理する方法として、Laravelには「migration (マイグレーション)」というものが備わっています。
だれが、いつ、どういった目的でテーブルの作成・編集・削除を行ったのかがわかる優れものです。


# 本 wiki の目標
・データベースのバージョン管理方法である migration について知ること。

・テーブルの追加、編集、削除を行えるようにすること。

・migration ファイルの命名規則を HUB3 内で統一すること。

・artisan migrate と artisan migrate:refresh と artisan migrate:fresh の違いを理解すること。


# 新規作成時
例として下記のような tests テーブルを新規作成する。
| 物理名 | 論理名 | 主キー | unique | null | データ型 | デフォルト値 |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| id | ID | ○ | ○ |  | bigint |  |
| name | 名前 |  | ○ |  | varchar |  |
| status | 表示状況 |  |  |  | int | 0 |
| user_id | ユーザー識別ID |  |  |  | bigint |  |
| remark | 備考 |  |  | ○ | varchar |  |
| created_at | 作成日時 |  |  |  | timestamp |  |
| updated_at | 更新日時 |  |  | ○ | timestamp |  |

**※注意**
一度実行された migration ファイルは基本的に再度実行されないため、テーブル内容の編集時には後述のやり方を参考すること。

## 手順
1. マイグレーションファイルの作成
2. マイグレーションファイルの編集
3. マイグレーションの実行


## 1. マイグレーションファイルの作成

`sail artisan make:migration create_tests_table`

成功すれば database/migrations ディレクトリ内に**現在日時_create_tests_table.php**が作成されます。


## 2. マイグレーションファイルの編集

上記コマンド実行後に下記のようにファイルが作成されます。
```
<?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('tests', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

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

「up」内にはテーブル作成時の処理、「down」内にはテーブル削除時の処理を書きます。( ※ロールバック処理の時に「down」が呼び出されるため )

下記が追加した後の内容です。

```
<?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('tests', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique()->comment('名前');
            $table->integer('status')->default(0)->comment('表示状況');
            $table->bigInteger('user_id')->comment('ユーザー識別ID');
            $table->string('remark')->comment('備考')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('tests');
    }
};
```
id については `$table->id();`にて自動増分 ( Auto Increment ) の id カラムが作成され、主キーと認識されます。

created_at, updated_at については `$table->timestamps();` にてどちらも追加されます。

わかりやすいように `->commnet('論理名')` を必ずつけましょう。

データ型、カラム修飾子参考 https://qiita.com/Takahiro_Nago/items/51eb0e9f1c8bbc2c9852


## 3. マイグレーションの実行

`sail artisan migrate`

こちらを実行で env に接続された DB へ新規テーブルが作成されます！

設計の内容と相違なければ完了です。




# テーブル編集時
例として tests テーブルから text カラム ( 本文 ) を追加し、

既存カラムに対しても更新を行う

status のデータ型を varchar に変更

user_id を unique を設定

remark のカラム名を remark_update に変更
| 物理名 | 論理名 | 主キー | unique | null | データ型 | デフォルト値 |
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
| id | ID | ○ | ○ |  | bigint |  |
| name | 名前 |  |  |  | varchar |  |
| status | 表示状況 |  |  |  | **varchar** | 0 |
| user_id | ユーザー識別ID |  | **○** |  | bigint |  |
| **remark_update** | 備考 |  |  | ○ | varchar |  |
| created_at | 作成日時 |  |  |  | timestamp |  |
| updated_at | 更新日時 |  |  | ○ | timestamp |  |


## 手順
手順自体は新規作成時と変わりませんが、ファイルの命名、「down」の処理内容に修正が必要なためそちらのみ記載します。

1. マイグレーションファイルの作成
2. マイグレーションファイルの編集
3. マイグレーションの実行


## 1. マイグレーションファイルの作成

カラム追加・更新 `sail artisan make:migration modify_tests_table --table=tests`

カラム削除 `sail artisan make:migration remove_column_from_tests_table --table=tests`


## 2. マイグレーションファイルの編集

作成ファイルに対し、追加の場合は下記のように記載します。

「up」内にはテーブルに対しての処理、「down」内には「up」の処理内容を打ち消す処理を書きます。

```
return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('tests', function (Blueprint $table) {
            // textカラムの追加
            $table->string('text')->comment('本文')->nullable();

            // 既存カラムの更新
            $table->string('status')->comment('表示状況')->change();
            $table->bigInteger('user_id')->comment('ユーザー識別ID')->unique()->change();
            $table->renameColumn('remark', 'remark_update');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('tests', function (Blueprint $table) {
            // textカラムの削除
            $table->dropColumn('text');

            // 既存カラムを戻す
            $table->integer('status')->comment('表示状況')->change();
            $table->bigInteger('user_id')->comment('ユーザー識別ID')->unique(false)->change();
            $table->renameColumn('remark_update', 'remark')->change();
        });
    }
};
```

カラム更新についてはこちらを参考にしました。https://qiita.com/mdrq/items/f10e488caa4497eec79b


## 3. マイグレーションの実行

`sail artisan migrate`

カラムが編集、追加されていれば完了です！


# よく使うコマンド
### `sail artisan migrate`

**migration ファイルの up の処理を実行**し、テーブルの作成を行います。

一度実行したファイルは実行されません。


### `sail artisan migrate:refresh`

**migrations ファイルの down の処理を実行しロールバックを行った後に migrations ファイルの up の処理を実行**し、テーブルの作成を行います。

一度実行したファイルも実行されますが、ロールバックされたテーブルのデータはリセットされます。


### `sail artisan migrate:fresh`

**テーブルを削除した後に migrations ファイルの up の処理を実行**し、テーブルの作成を行います。

down は実行されず、migrations にて管理されていないテーブルも削除されます。


### `sail artisan migrate:rollback`

**migrations ファイルの down の処理を実行しロールバックする**

### `sail artisan migrate:rollback --step=1`

**migrations ファイルの最新の 1 件をロールバックする**

数字部分を変えることで何件ロールバックするか変更することができます。

新しく migration ファイルを作成した際に down の記述ができているか確認が行えます。


# トラブルシューティング
・`$table->increments('id');` と `$table->id();` は何が違うの？

`$table->increments('id');` は古いバージョンの Laravel で使用されていた方法で新しいバージョン（5.8以降）では非推奨とされています。