Laravel 11へのバージョンアップでマイグレーションが失敗する

Laravel 11で、カラム変更時のchange()メソッドの挙動が変わりました。

既存のマイグレーションはエラーなく通ってしまうため、意図しないスキーマが気づかないうちに作られるのが厄介です。

変更点

change()は、定義に明示した属性のみを適用し、省略した属性は削除するようになりました。

維持したい属性はすべて書き直す必要があります。

// Laravel 11以降:維持する属性をすべて明示する
$table->integer('votes')->unsigned()->default(1)->comment('my comment')->change();

unsigned()default(1)を省けば、その属性は失われます。

背景

Laravel 10以前はdoctrine/dbalに依存し、変更時に既存のカラム定義をDBから読み取って差分を適用していました。
省略した属性が維持されて見えたのはこのためです。

Laravel 11ではdoctrine/dbal依存が廃止され、ネイティブのスキーマ操作に移行しました。
change()は与えられた定義をそのまま新しい状態として適用するため、明示しない属性は引き継がれません。

実害が出やすいケース

旧挙動を前提に書かれたchange()を、Laravel 11環境でロールバック・再適用するケースです。

// 旧挙動では unsigned / default が維持される前提
$table->integer('votes')->change();

これを再適用すると属性が欠落し、意図と異なるスキーマになります。

マイグレーション自体は成功扱いで終わるため、気づきにくいのが問題です。

バージョンアップ時は、既存のchange()呼び出しを洗い出し、維持すべき属性が明示されているか確認してください。

参考: Laravel 11 マイグレーションドキュメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください