初心者による初心者のための備忘録です。
LaravelにてDBを操作する時に使うマイグレーションですが
外部キー制約でエラーが出て、なかなか進まん!という私のような方もいるかと思います。
ある程度慣れてきてから公式ドキュメントを見ると書いてあったりするんですけど・・・。それが初心者の我々にとっては読み解くのすら難しい
ってことでなるべく自分向けに、わかりやすく。
【開発環境】
Laravel5.8
【起きるエラー】
他のテーブルのカラムとひも付けたい。と思って外部キー制約をつけて
php artisan migrate
と叩いても
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table problems
add constraint problems_drills_id_foreign
foreign key (drills_id
) references drills
(id
) on delete cascade on update cascade)
のように、外部キーを付けたマイグレーションファイルの部分でエラーが返ってきてしまう。
【よくやるミス(私はだいたいコレのどれか)】
●スペルミスはないか?
例えば外部キーを設定しようとしているカラム名と、外部キー制約のところのカラム名が違う。
$table->bigInteger('users_id')->unsigned();
〜
〜
//外部キー制約
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
上のusers_id
と下のforeign()の中のuser_id
が不一致パターン。
●マイグレーションの順番がおかしくないか?
マイグレーションはどうやら日付順(作成日順)に読み込まれるようなので
「まだできていないテーブル」のカラムに向けた外部キーをつけようとしてもエラーになる。
例えば
$table->foreign('category_id')->reference('id')->on('category')
のように
商品テーブルのcategory_idと、カテゴリーテーブルのidをひも付けようとしても
(この場合)カテゴリーテーブルが先に出来てないと「え、ドコとひも付けるん?」となる。
ちなみに上記のエラーはこのパターンでした。
この場合はマイグレーションファイル名の日付部分を商品テーブル作成のマイグレーションファイルよりも前の日付にしてあげる
【よくわかってないけどコレでいける!】
作成時(migrate実行時)でエラー出るのは私の場合、上記のどちらかなんですが
問題はmigrate:rollback
を実行したとき
ここでしょっちゅうつまずく。軽い恐怖症。
私はイマイチ分かってはいないんですが(汗)外部キー制約付けたいカラムに対して下記のように書けばエラーなく通るようになりました
//onDelete('cascade')とonUpdate('cascade')があるといける
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
※公式ドキュメント
https://readouble.com/laravel/5.8/ja/migrations.html
コレでrollback
もfresh
も怖くないぜ!と思いたい・・・。