マイグレーションでよく失敗する、
- カラムの型問題
- マイグレーションファイルの実行順問題
についてまとめておきます。
カラムの型問題
外部キーを設定する場合は、参照先のカラムと同じ型にする必要があります。
一般に、プライマリーキーには以下のようにincrementsを指定しますが、これは自動的にunsigned int型のカラムを生成します。
migrationファイル
$table->increments('id');
よって、外部キーを設定する際にもunsigned型を指定する必要があります。
※以下のどちらでも可。
migrationファイル
//方法1
$table->integer('user_id')->unsigned()
//方法2
$table->unsignedInteger('user_id');
//共通
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade'); //親テーブルで行削除された場合、子テーブルの対応する行も削除する
マイグレーションファイルの実行順問題
外部キー参照先のマイグレーションファイルが実行されていない状態で、外部キーを設定したマイグレーションファイルが実行されると、参照するテーブルがないとエラーを返される。
SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'medium_id' doesn't exist in table (SQL: alter table `teaching_materials` add constraint `teaching_materials_medium_id_foreign` foreign key (`medium_id`) references `media` (`id`))
マイグレーションはファイルを作成した順(ファイル名になっている作成日時順)に実行される。
例えば、postsテーブルの外部キー参照先にusersテーブルを設定したい場合は、usersマイグレーションの作成後にpostsのマイグレーションファイルを作成し、マイグレーションを実行する。