外部キー制約名について、個人的に勉強になったので忘備録がてら投稿します💻
やりたいこと
hogehoge_fugafuga_piyopiyo_hogerahogera
テーブルを作成するとき、
foo_bar_foo_bar
テーブルのidを外部キーとして持たせたい。
Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
$table->id();
$table->foreignId('foo_bar_foo_bar_id')
->constrained()
});
マイグレートする
マイグレートしたらSQLエラー発生
なにやら名前が長いらしい..
SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name 'hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_foreign' is too long
調べてみるとMySQLで作成できる制約名は64文字がMAXみたい。
テーブル名も最大64文字とのこと。
外部キーを作成するとき、Laravelはよしなに「テーブル名」と「外部キーとなるカラム名」を結合して外部キー制約名を命名しにいくので、長めになってしまう時があるよ!
`hogehoge_fugafuga_piyopiyo_hogerahogera` + `foo_bar_foo_bar_id` + `_foreign` = 65文字
結論
index()
で、64文字以内の好きな名前をつける。
Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
$table->id();
$table->foreignId('foo_bar_foo_bar_id')
->constrained()
->index('hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk');
});
マイグレートが通り、index_nameがちゃんとつく(DBクライアントツールで確認)
ちなみに、index()
はカラム修飾子だと思ってたのでconstrained()
の前に書いてみましたが、これだと正しく動いてくれません。なぜ...?(有識者の方教えてください🙇)
Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
$table->id();
$table->foreignId('foo_bar_foo_bar_id')
->index('hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk')
->constrained()
});
備考
foreign
の第二引数に名前を渡せそうかも。
ですが、Laravelさん曰くこれは冗長な書き方らしいです。
Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
$table->unsignedBigInteger('foo_bar_foo_bar_id');
$table->foreign('foo_bar_foo_bar_id', 'hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk')
->references('id')
->on('foo_bar_foo_bar');
});