171日目 Laravel(PHP)でマイグレーションファイルを使いこなそう！ by社畜♀

# 第２話《マイグレーションって便利だなぁ～》

Laravelのマイグレーションを触る機会があり、理解できると楽しかったのでまとめておきたいと思います！  
自分と同じような人の助けになればなによりです。:bow_tone1:


Laravelのマイグレーションは、データベースのスキーマ（テーブル構成やカラムなど）を簡単に管理・変更するための強力なツールです。  
主にWebアプリケーションフレームワークで使用され、データベース構造の変更をコードで管理できるため、変更履歴を追跡することが可能です。  
また、マイグレーションはバージョン管理システムを通じて他の開発者と共有することも簡単に行えます。:ok_hand_tone1:

## マイグレーションの基本コマンド

Laravelでは、マイグレーションを管理するためのさまざまなコマンドが用意されています。
<br>

**１．マイグレーションファイルの作成**

新しいマイグレーションファイルを作成するには、Laravelプロジェクトのルートディレクトリで以下のコマンドを実行します。

```bash:bash
php artisan make:migration create_users_table --create=users
```

`create_users_table`はマイグレーションの名前で、これにより`database/migrations`フォルダに新しいマイグレーションファイルが生成されます。  
ファイル名には通常、実行する操作の説明が含まれます。

```php:php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();  // 主キーのIDカラムを作成
            $table->string('name');  // 名前用の文字列カラムを作成
            $table->string('email')->unique();  
              // メールアドレス用のユニークな文字列カラムを作成
            $table->timestamp('email_verified_at')->nullable();  
              // メール確認日時用のタイムスタンプカラムを作成（NULL許可）
            $table->string('password');  // パスワード用の文字列カラムを作成
            $table->rememberToken();
            $table->timestamps();  
              // created_atとupdated_at用のタイムスタンプカラムを作成
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');  // usersテーブルを削除
    }
}
```

このマイグレーションファイルでは、upメソッドでテーブルを作成し、downメソッドでテーブルを削除しています。
<br>

**２．マイグレーションの実行**

作成したマイグレーションを実行して、データベースに変更を反映するには以下のコマンドを実行します。

```bash:bash
php artisan migrate
```

このコマンドは未適用のマイグレーションをすべて実行します。

<br>

**３．マイグレーションの状態確認**

各マイグレーションの適用状態を表示するには、以下のコマンドを実行します。

```bash:bash
php artisan migrate:status
```

<br>

**４．マイグレーションのロールバック**

データベースに適用したマイグレーションを元に戻したい場合は、以下のコマンドを使います。

```bash:bash
php artisan migrate:rollback
```

<br>

**５．マイグレーションのリセット**

すべてのマイグレーションをロールバックし、データベースを初期状態に戻します。

```bash:bash
php artisan migrate:reset
```

<br>

**６．マイグレーションのリフレッシュ**

すべてのマイグレーションをリセットしてから、再度マイグレーションを実行する場合に使用します。

```bash:bash
php artisan migrate:refresh
```

## テーブル操作

Laravelのマイグレーションでは、テーブルに対してカラムを追加・変更・削除などの操作を行うためのコマンドや方法が用意されています。  
ここでは、カラムの追加、変更、削除に関連するコマンドとその使用例を紹介します。

<br>

**１．カラムの追加 (add)**

既存のテーブルに新しいカラムを追加するには、`add`メソッドを使います。  
まず、以下のコマンドでマイグレーションファイルを作成します。

```bash:bash
php artisan make:migration add_column_to_users_table --table=users
```

マイグレーションファイルを編集して、新しいカラムを追加します。

```php:php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('phone_number')->after('email');  
          // 'email'カラムの後に'phone_number'カラムを追加
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('phone_number');  
          // 追加した'phone_number'カラムを削除
    });
}
```

<br>

**２．カラムの型変更 (change)**

既存のカラムのデータ型や属性を変更するには、`change`メソッドを使います。  
まず、以下のコマンドでマイグレーションファイルを作成します。

```bash:bash
php artisan make:migration change_column_in_users_table --table=users
```

次に、マイグレーションファイルで変更内容を指定します。

```php:php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('name', 50)->change();  
          // 'name'カラムの最大長を50文字に変更
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('name')->change();  
          // 'name'カラムを元のデフォルトの長さ（通常255文字）に戻す
    });
}
```

<br>

**３．カラム名の変更**

既存のカラムの名前を変更するには、`renameColumn`メソッドを使用します。  
まず、マイグレーションファイルを作成します。

```bash:bash
php artisan make:migration rename_column_in_users_table --table=users
```

```php:php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->renameColumn('email', 'email_address');  
          // 'email'カラムを'email_address'に名前変更
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->renameColumn('email_address', 'email');  
          // 'email_address'カラムを元の'email'に名前を戻す
    });
}
```

<br>

**４．カラムの削除**

既存のカラムを削除するには、カラム名を指定して`dropColumn`メソッドを使います。  
まず、マイグレーションファイルを作成します。

```bash:bash
php artisan make:migration remove_column_from_users_table --table=users
```

```php:php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('remember_token');  
          // 'remember_token'カラムを削除
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->rememberToken();  // 削除した'remember_token'カラムを再作成
    });
}
```

### おまけ

**１．複数カラムの追加**

```php:php
public function up()
{
    Schema::table('table_name', function (Blueprint $table) {  
        $table->string('first_name')->after('email');  
          // 'email'カラムの後に'first_name'カラムを追加
        $table->string('last_name')->after('first_name');  
          // 'first_name'カラムの後に'last_name'カラムを追加
        $table->string('phone')->nullable()->after('last_name');  
          // 'last_name'カラムの後に'phone'カラムを追加（NULL許可）
    });
}

public function down()
{
    Schema::table('table_name', function (Blueprint $table) {  
        // 追加したカラムを削除
        $table->dropColumn(['first_name', 'last_name', 'phone']);
    });
}
```

<br>

**２．複数カラム名の変更**

```php:php
public function up()
{
    Schema::table('table_name', function (Blueprint $table) {  
        $table->renameColumn('old_column1', 'new_column1');  
          // 'old_column1'を'new_column1'に変更
        $table->renameColumn('old_column2', 'new_column2');  
          // 'old_column2'を'new_column2'に変更
        $table->renameColumn('old_column3', 'new_column3');  
          // 'old_column3'を'new_column3'に変更
    });
}

public function down()
{
    Schema::table('table_name', function (Blueprint $table) {  
        // 変更を元に戻す
        $table->renameColumn('new_column1', 'old_column1');
        $table->renameColumn('new_column2', 'old_column2');
        $table->renameColumn('new_column3', 'old_column3');
    });
}
```

<br>

**３．複数カラムの型変更**

```php:php
public function up()
{
    Schema::table('table_name', function (Blueprint $table) {  
        $table->bigInteger('column1')->change();  
          // 'column1'の型をintegerからbigIntegerに変更
        $table->text('column2')->nullable()->change();  
          // 'column2'の型をvarcharからtext、かつNULL許可に変更
        $table->decimal('column3', 8, 2)->change();  
          // 'column3'の型をdecimalに変更し、精度を設定
    });
}

public function down()
{
    Schema::table('table_name', function (Blueprint $table) {
        // 変更を元に戻す
        $table->integer('column1')->change();
        $table->string('column2')->nullable(false)->change();
        $table->float('column3')->change();
    });
}
```

## Laravelのマイグレーションにおけるupとdown

`up`と`down`のメソッドは、データベース構造の変更（追加、削除、変更など）を双方向に操作できるように設計されています。

`up`は「`マイグレーション適用時の処理`」を定義し、`down`は「`マイグレーションをロールバックする際の処理`」を定義します。これにより、スキーマの変更を簡単に巻き戻すことができます。  

### １．upメソッドの説明

・`up`メソッドはマイグレーションを実行する際に呼ばれ、データベースに新しいテーブルやカラムを追加したり、既存のテーブルを変更するための処理を定義します。  
・たとえば、新しいテーブルを作成したり、カラムを追加したり、インデックスを作成したりします。

### ２．downメソッドの説明

・`down`メソッドはマイグレーションをロールバックする際に呼ばれ、`up`で行った変更を元に戻すための処理を定義します。  
・たとえば、`up`で作成したテーブルやカラムを削除したり、名前変更を元に戻したりします。

# まとめ

|  操作  |  コマンド  |
| ---- | ---- |
|  カラムの追加  |  $table->string('column_name');  |
|  カラムの変更  |  $table->string('column_name')->change();  |
|  カラム名の変更  |  $table->renameColumn('old_name', 'new_name');  |
|  カラムの削除  |  $table->dropColumn('column_name');  |
|  複数カラムの削除  |  $table->dropColumn(['column1', 'column2']);  |
|  カラムのデフォルト値変更  |  $table->string('column_name')->default('value')->change();  |

Laravelのマイグレーションを使うことで、データベースのカラムを簡単に操作することができます。

<br>

**upメソッド：**  
データベースの変更を行うメソッド。  
新しいテーブルやカラムを作成、カラムの変更、インデックスの追加などを定義します。

**downメソッド：**  
`up`メソッドの変更を元に戻すためのメソッド。  
`up`で作成したテーブルやカラムを削除、名前変更を元に戻すなど、マイグレーションを巻き戻す処理を定義します。

<br>

マイグレーションファイルを作成し実行した後で、まだGitをコミットしてプッシュしていない場合は、ロールバックを行い、作成したテーブル（create）を直接変更して再度実行することができます。  
しかし、もしすでにプッシュしてしまった場合は、今回の追加・変更・削除コマンドを使用して新たなマイグレーションファイルを作成しましょう！  

ではでは、良きマイグレーション人生を！:raised_hand_tone2:

<br>

そして！超絶初心者ですので間違いがあれば是非お教えください！

**TO BE CONTINUED...**