【Laravel】既存テーブルにカラムを追加する

# はじめに
今回は、Laravelのマイグレーション機能を利用し、既存テーブルにカラムを追加する過程で、調べたことをまとめました。

※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。

# この記事の目的
以下内容についてアウトプット
- Artisan make:migrationコマンド
- マイグレーション機能
- カラムのデータ型

# この記事の内容


1. マイグレーションファイルの作成
2. テーブルの定義
3. マイグレーションを実行 
4. 参考 カラムのデータ型
5. 参考 Artisan make:migrationコマンド
6. 参考 その他処理
7. 参考 関連記事

# 1. マイグレーションファイルの作成
Artisan make:migrationコマンドを使用して、マイグレーションファイルを作成します。

```terminal
// 構文
php artisan make:migration 任意のマイグレーション名 --table=テーブル名

// 例 userテーブルにカラムを2つ追加
php artisan make:migration add_user_table_2columns  --table=user

```

**Tips :**
- マイグレーション名は任意
※クラス名と被るとエラーになる

- 既存のテーブルに変更を加える場合、 `--tableオプション` でテーブル名を指定する

# 2. テーブルの定義
先程作成したマイグレーションファイルに、テーブルの定義を行います。

```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.
     *
     * @return void
     */
    public function up()
    {
        // 追加したいカラムを定義
        Schema::table('追加先のテーブル名', function (Blueprint $table) {
            $table->カラムのデータ型('新規カラム名')->comment('コメント')->after('既存カラム名');          // 構文
            $table->timestamp('rest_password_expire_data')->nullable()->comment('パスワード再設定キーの有効期限');     // 例
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('user_m', function (Blueprint $table) {
            $table->dropColumn('上記で追加したカラム');          // 構文
            $table->dropColumn('rest_password_expire_data');     // 例
        });
    }
};
```

**Tips :**
- マイグレーションファイルには、カラムの名前・データ型・制約などを定義する

- `up()` ：追加したいカラムを定義する

- `down()` ：上記の処理を巻き戻す処理を記述

- `after()` ：カラムの順番を整理する
※指定した既存カラムの後に、新規で作成するカラムが入る

- TIMESTAMP型のカラムを追加する場合、 `nullable()メソッド` を使ってnull許容にする必要がある
※nullを許容しないとエラーいなる

- `comment()` ：DBのカラムに任意のコメントをつける

# 3. マイグレーションを実行 
下記コマンドで、マイグレーションを実行します。

```terminal
// 構文
php artisan migrate
```

# 4. 参考 カラムのデータ型
カラムのデータ型について、よく使うものをまとめました。


| データ型 | 説明 | 備考
| ------ | --- | --- |
| char('カラム名', 長さ) | 長さ指定の文字型
| string('カラム名') | VARCHAR型 | デフォルト255文字
| string('カラム名', 長さ) | 長さ指定のVARCHAR型
| text('カラム名') | TEXT型 | 最大長 65535文字
| TINYINT('カラム名') |	数値型 | 1バイト（範囲 -128〜127）
| SMALLINT('カラム名') | 数値型 | 	2バイト（範囲 -32768〜32767）
| MEDIUMINT('カラム名') | 数値型 | 3バイト（範囲 -8388608〜8388607）
| integer('カラム名') | 数値型 | 4バイト（範囲 -2147483647〜2147483647）
| BIGINT('カラム名') | 数値型 | 8バイト（範囲 -9223372036854775808〜9223372036854775807）
| double('カラム名', 合計桁数, 小数桁数) | 浮動小数点型 
| enum('カラム名', ['定数', '定数']) | ENUM型
| date('カラム名') | 日付型
| time('カラム名') | 時間型
| dateTime(カラム名) | 日時型
| timestamp('カラム名') | TIMESTAMP型 | not null制約が適用
| timestamps() | created_atとupdate_atカラム
| nullableTimestamps() | NULL値を許す以外、timestamps()と同じ
| boolean('カラム名') | 真偽値 | フラグ関係のカラム
| increments('id') | 「符号なしINT」を使用した自動増分ID（主キー） 
| json('カラム名') | JSON型
| binary('カラム名') | バイナリデータ型

# 5. 参考 Artisan make:migrationコマンド
- `php artisan migrate`
未処理のマイグレーションをすべて実行する

- `php artisan migrate:status`
どのマイグレーションが実行されているかを確認する

- `php artisan migrate:rollback`
マイグレーション操作をロールバックする

- `php artisan migrate:rollback --step=ステップ数` 
直近からステップ数分、マイグレーション操作をロールバックする



# 6. 参考 その他処理

### 既存のマイグレーションファイルを編集したい場合
例）カラム名の修正や、制約の追加など

① 該当のマイグレーションファイルをロールバックする
  念のため、正しくロールバックできているかステータスを確認する
```terminal
// どちらかのコマンドを実行する
php artisan migrate:rollback
php artisan migrate:rollback --step=ステップ数

// ステータス確認
php artisan migrate:status
```
② マイグレーションファイルを編集する
③ マイグレートを行う
```terminal
php artisan migrate
```

### 既存のカラム名を修正したい場合
例）userテーブルの `name` カラムを `student_name` に変更したい

① 以下コマンドを実行し、マイグレーションファイルを作成する
```terminal
// 構文
php artisan make:migration 任意のマイグレーション名

// 例
php artisan make:migration rename_column_user_table
```

② マイグレーションファイルを編集する
```php
// 省略

public function up()
    {
        Schema::table('修正先のテーブル名', function (Blueprint $table) {
            $table->renameColumn('現在のカラム名', '修正後のカラム名');
            $table->renameColumn('name', 'student_name');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('修正先のテーブル名', function (Blueprint $table) {
            $table->renameColumn('修正後のカラム名', '現在のカラム名');
            $table->renameColumn('student_name', 'name');
        });
    }
}
```

③ マイグレートを行う
```terminal
php artisan migrate
```

# 7. 参考 関連記事

https://qiita.com/rikako_hira/items/dda69fdc45d19f73a34a