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()呼び出しを洗い出し、維持すべき属性が明示されているか確認してください。