laravelでmigrationを実行するため、
php artisan migrate:refresh
を叩いたところ、以下のエラーが出た。
Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `comments`)
親子関係のアソシエーションを組んでいる場合、
migrationファイルのdownメソッド
で、
親子関係の親に当たるテーブルも削除しないと、このエラーが出るらしい。
なのでこうした。
// 省略
public function down()
{
Schema::dropIfExists('posts'); //付け足した
Schema::dropIfExists('comments');
}
でもまだ同じようなエラーが出た。
(エラー文のテーブル名がposts に変わっただけの同じエラー。)
解決した方法
調べたところ、テーブルのdropの順番
が大事らしい。
子テーブルであるcommentsから先にdropするよう順番書き換えた。
今回は、posts
テーブルが親、comments
テーブルが子。
なので以下のように記述順番を入れ替えた。
// 省略
public function down()
{
Schema::dropIfExists('comments'); //子テーブルが先にdropされるよう順番を上にした
Schema::dropIfExists('posts');
}
アソシエーション組んでいる場合、
外部キーを持っている子テーブルからdropしないと、
子テーブルの外部キー制約に引っかかるらしい。
downのdropIfExistsメソッドを 子テーブル
-> 親テーブル
の順番で書いて、解決。
解決したと思いきや。
【続】laravelのmigrationでハマった話