Laravelのマイグレーションで外部キーが作成できなかった件についてのメモ。
外部キーが作成できない原因なぞいろいろあるが、Laravelのちょっとした仕様が理由だった件について。
問題
まず、下記で外部キーの作成を試みたところ、
$table->foreign('product_id', 'product_id_foreign')
->references('id')->on('products')
->onDelete(self::CASCADE)->onUpdate(self::CASCADE);
マイグレーションを実行すると、次のようなエラーになった。
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `products_product_categories` add constraint `product_id_foreign` foreign key (`product_id`) references `products` (`id`) on delete cascade on update cascade)
原因
結論から書くと、カラムの型が一致していなかったのが原因。
プライマリキーを外部キーに使用することはよくあると思うが、参照されるプライマリキーが unsigned int
だったのに対して、外部キーを設定しようとしたカラムが int
だった。
Laravelの場合、プライマリキーの設定は一般的に下記のようにすると思うが、increments
メソッドは暗黙的にunsigned int
型のカラムを生成する。
$table->increments('id');
ちゃんとドキュメントに書いてある。
解決策
言うまでもないが、外部キーを設定するカラムを参照先のカラムの型と同じにすればOK。