LoginSignup
1
0

More than 1 year has passed since last update.

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

Posted at

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

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

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

カラムの型問題

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0