BLOG

ブログ

2023/09/11 プログラミング技術系

【Laravel】migrationで既存のカラム名とコメントを変更する

この記事を書いた人 T.S

Laravelのマイグレーションファイルで、既存テーブルのカラムに対し、カラム名とコメントを変更をする方法をご紹介します。

参考:Laravel 9.x マイグレーション

検証環境は以下の通りです。

  • Laravel:9.38.0
  • PHP:8.0.25
  • MySQL:8.0.29

はじめに(事前準備)

まずは、マイグレーションを実行するためのマイグレーションファイルを作成します。Laravelで用意されているArtisanコマンドを使用して作成するのがオススメです👍

// マイグレーションファイルの作成
// オプションでファイル名、テーブル名を付けるとわかりやすいです!
$ php artisan make:migration ファイル名 --table=テーブル名

// 例:usersテーブルに対し、カラムを変更する用のマイグレーションファイルを作成
$ php artisan make:migration change_column_users_table --table=users

マイグレーションファイルが作成できたら、実行したいコードをpublic function up()の中に書いていきます。今回の記事でご紹介するカラム名・カラムコメントの変更用コードは、このup()の中に記載するものになります!

<?php

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

return new class extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            // 実行コードをここに記載('php artisan migrate'で実行される)
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            // ロールバック用のコードをここに記載('php artisan migrate:rollback'で実行される)
        });
    }
};

カラム名の変更

既存のカラムに対して名前を変更する場合は、renameColumnメソッドを使用します。

Schema::table('テーブル名', function (Blueprint $table) {
    $table->renameColumn('変更前のカラム名', '変更後のカラム名');
});

// 例:emailカラムを、email_addressカラムに変更したい場合
Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('email', 'email_address');
});

🚨 補足:renameColumn実行でエラーが出た場合

MySQLのバージョンが8.0.3未満の場合、マイグレーション実行時に、Class "Doctrine\DBAL\Driver\AbstractMySQLDriver" not foundのエラーが発生します。その場合、doctrine/dbalライブラリが必要になりますので、下記コマンドでインストールしましょう!

$ composer require doctrine/dbal

以下のリリースよりも古いデータベースを使用している場合、カラムの名前を変更する前に、Composerパッケージマネージャで、doctrine/dbalライブラリをインストールしておく必要があります。

MySQL < 8.0.3
MariaDB < 10.5.2
SQLite < 3.25.0

Laravel 9.x マイグレーション レガシーデータベースにおけるカラムのリネーム

カラムコメントの変更・追加

既存のカラムに対してコメントの変更もしくは追加をする場合は、型(カラム名)->commnet(コメント)->change()という記述をします。

Schema::table('テーブル名', function (Blueprint $table) {
    $table->カラムの型('カラム名')
    	->comment('変更後のコメント')
    	->change();
});

// 例:emailカラムのコメントを、"メールアドレス"に変更したい場合
Schema::table('users', function (Blueprint $table) {
    $table->string('email')
    	->comment('メールアドレス')
    	->change();
});

🚨 注意点

change()メソッドを使用するためには、カラム型('カラム名')の記載から始める必要があります。もしここでカラム型を間違って記載すると、コメントだけでなく型も変更となってしまいます。

カラム名のミスはThere is no columnエラーとなり、マイグレーション自体が失敗しますが、カラム型のミスはエラーもなくすんなり実行 → カラム型変更まで通ってしまいます。
ですので、既存カラムのコメント変更・追加をする際は、カラム型に気をつけて記載しましょう👍

ちなみに、カラム修飾子なるもので設定される、NULL許容フラグ(nullable())やカラムの順番(after())などは、再度指定しなくても設定値が引き継がれるので、特に気にしなくてOKです!

カラム名とコメントの同時変更

既存のカラムに対してカラム名とコメントの両方を変更する場合は、下記のようにSchema::tableを2回呼び出す必要があります。そして、呼び出したスキーマ内で、それぞれ「カラム名の変更」と「コメント変更」の記述をします。

// 「カラム名の変更」と「コメント変更」を別スキーマに分けて書く
Schema::table('テーブル名', function (Blueprint $table) {
    $table->renameColumn('変更前のカラム名', '変更後のカラム名');
});
Schema::table('テーブル名', function (Blueprint $table) {
    $table->カラムの型('変更後のカラム名')
    	->comment('変更後のコメント')
    	->change();
});

// 例:emailカラムを、email_addressカラムに変更し、"メールアドレス"というコメントをつけたい場合
Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('email', 'email_address');
});
Schema::table('users', function (Blueprint $table) {
    $table->string('email_address')
    	->comment('メールアドレス')
    	->change();
});

スキーマの呼び出しを1回で済ます簡潔な方法はないかと色々試したのですが、結果は上手くいかず…🤔

同じスキーマで「カラム名変更 → カラムコメント更新」や、「カラムコメント更新 → カラム名変更」など数パターン試してみましたが、いずれの方法もカラム名・カラムコメントどちらかの更新が失敗してしまいました(ページ下部の”おまけ”に挑戦結果を残してます…💦)

ですので、「カラム変更」と「コメント変更」については、別のスキーマに分けて書く必要があるようです。

おわりに

今回は、Laravelのマイグレーションファイルにて、既存テーブルのカラムに対し、カラム名とコメントを変更する方法についてご紹介しました。

カラム名の変更は、専用のメソッド(renameColumn)が用意されているのでスマートに記述できます🙆‍♂️ …が、カラムコメントの変更は、対象のカラム名だけでなくカラム型の記載も必須のため注意が必要です!
ちなみにRailsのマイグレーションファイルには、カラムコメントの変更用メソッド(change_column_comment)が存在するらしく、いつかLaravelにも似たメソッドが導入されないかな〜と期待しています😀

おまけ:カラム名とコメントの同時変更の失敗例

なんとか同じスキーマで「カラム名&コメント変更」ができないか挑戦してみた結果になります(いずれも失敗)

この方法だといけたよ!などありましたら情報お待ちしております😭

// 失敗①:同スキーマ内でカラム名変更→変更後カラム名に対してコメント変更を行う
//  結果:変更後のカラム名が見つからないエラーとなる
Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('email', 'email_address');

    $table->string('email_address')
        ->comment('メールアドレス')
        ->change();
});

// 失敗②:同じスキーマ内でカラム名変更→変更前カラム名に対してコメント変更を行う
//  結果:エラーにはならないが、カラム名の変更だけが実行される
Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('email', 'email_address');

    $table->string('email')
        ->comment('メールアドレス')
        ->change();
});

// 失敗③:同じスキーマ内で変更前カラム名に対してコメント変更→カラム名変更を行う
//  結果:エラーにはならないが、カラム名の変更だけが実行される
Schema::table('users', function (Blueprint $table) {
	$table->string('email')
        ->comment('メールアドレス')
        ->change();

    $table->renameColumn('email', 'email_address');
});

// 失敗④:同じスキーマ内でカラム名変更&コメント変更を行なってみる
//  結果:エラーにはならないが、コメントの変更だけ実行される
//     change()で実行できる関数に、カラム名の変更ができそうなものが存在しないため無理そう
//     実行可能関数:/vendor/laravel/framework/src/Illuminate/Database/Schema/ColumnDefinition.php
Schema::table('users', function (Blueprint $table) {
	$table->string('email')
        ->renameColumn('email', 'email_address')
        ->comment('メールアドレス')
        ->change();
});


株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!

アーカイブ