Laravelバージョンアップ時の注意点(カラム修飾子)
こんにちは!Booost株式会社Webエンジニアのramcursweです。
先日、Laravelのバージョンアップ作業(10→12)を行ったのですが、その際に注意すべき点がありましたので、備忘および共有としてまとめたいと思います。
カラム修飾子(カラム変更時の注意点)
・Laravel 11.x アップグレードガイド(カラムの変更)
アップグレードガイドにも記載されている通り、カラム変更時はマイグレーションファイルで修飾子を明示する必要があります。
例として、以下の2つのマイグレーションファイルがあるとします。
(例)
・マイグレーションファイル1
Schema::create('ramen', function (Blueprint $table) {
$table->string('flavor')->default('汁なし')->comment('味');
});
・マイグレーションファイル2
Schema::table('ramen', function (Blueprint $table) {
$table->string('flavor')->nullable()->change();
});
1つ目のマイグレーションが実行済みの状態で、2つ目のカラム変更用のchange()を実行すると、Laravel11以上においては、この例の場合はdefault・commentで設定済みの内容が消え、nullableだけが有効になります。
もし、過去に設定済みの内容も残したい場合、以下のように2つ目で全てを再定義する必要があります。
Schema::table('ramen', function (Blueprint $table) {
$table->string('flavor')
->default('汁なし')
->comment('味')
->nullable()
->change();
});
正直面倒くさいですよね…
当時、「過去分のマイグレーションファイルはどうなるのか?いちいち各テーブル・カラムの変更履歴を追い、全て再定義していかないといけないのか?」と疑問に思いました(もしそうであるなら途方もない…)。
しかし、Laravelは救済策を用意してくれていました!
(以下、アップグレードガイドより引用)
既存カラムの属性を保持するために、アプリケーション内の既存の全「変更(change)」マイグレーションを更新したくない場合は、単純にマイグレーションを圧縮してください。
php artisan schema:dump
一度マイグレーション圧縮したら、Laravelは保留中のマイグレーションを実行する前に、アプリケーションのスキーマファイルを使ってデータベースを「マイグレーション」します。
このdump対応により、それまでのカラムの変更内容は全て保存されるので、過去分については変更履歴を1つずつ追跡して再定義するというような作業は不要です(ありがとうLaravel!)。
注意点
上記のdump対応はあくまで過去分に対して有効であり、バージョンアップ完了以降分については、「カラム修飾子(カラム変更時の注意点)」で挙げている点の考慮が必要です。
せっかくdumpでそれまでのカラム変更を保存できていたとしても、バージョンアップ後にうかつにchange()で変更すると、過去のカラム設定が意図せず消えてしまいます。
バージョンアップ以降にchange()を使う際は、dump内容や既存のDBテーブルのカラム設定内容から必要な修飾子を判定し、漏れなく再定義するようにしましょう。
学び
当たり前のことですが、公式ドキュメントを読み込むことの重要性を改めて感じました。
その上で、開発しているシステムにおける対応方針を検討する必要があります。
(諸々の事情により、ドキュメント通りの内容をそのまま適用できないケースもあると思いますが…)
Discussion