【Laravel】マイグレーションで外部キーを設定する場合の注意事項


マイグレーションでよく失敗する、

  • カラムの型問題
  • マイグレーションファイルの実行順問題

についてまとめておきます。

カラムの型問題

外部キーを設定する場合は、参照先のカラムと同じ型にする必要があります。

一般に、プライマリーキーには以下のように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のマイグレーションファイルを作成し、マイグレーションを実行する。