🔁

Laravel でカラムを追加・変更・削除する場合のマイグレーション

2024/09/25に公開

状況

カラムを追加・変更・削除したい.マイグレーションがどんな感じだったか忘れるためメモ.テーブル作成と異なる部分がある.

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

カラムの変更もマイグレーションで行う.

  • 本来はカラムはテーブル作成時点で決定しておくことが望ましい.

  • マイグレーションは実行した内容を取り消せる(ロールバック)ため,不具合が生じても対応できる場合が多い.

  • コマンドの最後に _to_テーブル名_table をつけるとテーブルとの連携を自動でやってくれる.

【例】posts テーブルに hoge カラムを追加したい場合

下記コマンドを実行する.

php artisan make:migration add_hoge_to_posts_table

# 実行結果
Created Migration: xxxx_xx_xx_xxxxxx_add_hoge_to_posts_table

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

// database/migrations/xxxx_xx_xx_xxxxxx_add_hoge_to_posts_table.php

public function up()
{
  Schema::table('posts', function (Blueprint $table) {
    // 🔽 hoge カラムを post カラムの後に追加
    $table->string('hoge')->after('post')->nullable();
  });
}

public function down()
{
  Schema::table('posts', function (Blueprint $table) {
    // 🔽 カラム削除
    $table->dropColumn(['hoge']);
  });
}

マイグレーション実行

以下のコマンドを実行する.テーブルにカラムが追加される.

php artisan migrate

# 実行結果
Migrating: xxxx_xx_xx_xxxxxx_add_hoge_to_posts_table
Migrated:  xxxx_xx_xx_xxxxxx_add_hoge_to_posts_table (102.98ms)

【補足】リレーションを表すカラムの場合

マイグレーションファイルを作成する流れは同じ.

hoge_id」など,リレーションを表すカラムを追加する場合は,drop メソッドに注意する必要がある.

この場合,カラムを削除するだけでなく下記の手順が必要になる.

  1. カラムの連携を削除する.

  2. カラム自体を削除する.

// database/migrations/xxxx_xx_xx_xxxxxx_add_hoge_id_to_posts_table.php

public function up()
{
  Schema::table('posts', function (Blueprint $table) {
    // 🔽 hoge_id(hogesテーブルのid)を追加する例
    $table->foreignId('hoge_id')->after('id')->constrained()->cascadeOnDelete();
  });
}

public function down()
{
  Schema::table('posts', function (Blueprint $table) {
    // 🔽 テーブル連携を削除 → カラム削除
    $table->dropForeign(['hoge_id']);
    $table->dropColumn(['hoge_id']);
  });
}

マイグレーションファイルに記述したら,コマンド実行は同じ.

まとめ

特に外部キー制約を持つカラムを追加・変更・削除する場合はハマることもあるので注意.

以上だ( `・ω・)b

GitHubで編集を提案

Discussion