イントロ
Laravelでテーブルのカラムに外部キー制約を実装する方法を紹介するZE☆
俺「外部キー制約ってなんやねん」
って方はこちらで詳しく解説しています!
こちらの記事はLaravelドキュメントのマイグレーションにある外部キー制約の段落を分かりやすく噛み砕いたものになります。
今回解説するLaravelのバージョンは8.xです!
migrationを操作する方法が2つあるよ!
Laravelでカラムに外部キー制約を実装するには、migrationを操作する必要があります!
migrationでの設定方法は大きく分けて2つ方法があります!
今回はドキキュメントに沿ってusersテーブルとpostsテーブルを例に紹介します。
今まで通りの方法
まずは今までのマニュアル通りの方法を紹介します。
実際のコードを見てみましょう。
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id'); // 1
$table->foreign('user_id')->references('id')->on('users'); // 2
});
まずは1行目で普通にカラムを作る
まずは普段migrationを操作しているように、user_idを作成します。
このとき注意したいのは、user_idのデータ型はなんでもOKなわけではなくて、usersテーブルのidカラムと同じでなければなりません。
デフォルトのusersテーブルではidカラムを作成するときに$table->id()を用いて作成されます。
$table->id()を用いて作成されるカラムのデータ型はunsignedBigInteger型なので、今回migrationに作成するuser_idのデータ型もunsignedBigInteger型で設定しましょう!
2行目で外部キー制約をかける
そしたら、新しい行で$table->foreign('user_id')->references('id')->on('users');のようにして外部キー制約を実装します。
-
foreign('xxx')で外部キー制約したいカラムを指定 -
references('yyy')で参照したい外部のカラム名を指定 -
on('zzz')でその参照したいカラムがあるテーブル名を指定
これらより、usersテーブルにあるidカラムをpostsテーブルのuser_idに参照させたい時は、
$table->foreign('user_id')->references('id')->on('users');
と書くことでuser_idを外部キー制約することができます!
2つ目の方法(省略形)
2つ目の方法は今紹介した方法よりも短く書くことができます。
具体的にはforeignIdメソッドを使うことで書き直すことができます。
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained();
});
外部キー制約したいカラム名をforeignIdメソッドの引数に与えます。
constrainedメソッドはforeignIdメソッドに与えられた引数からいい感じに「どのテーブルのどのカラム」を参照したいのかを判断してくれます。
user_idをforeignidメソッドに与えると、contrainedメソッドは
「user_idだから、usersテーブルのidカラムを参照したいんだな」
と判断してくれます。
なので外部キー制約を指定するときは命名法に注意しましょう!