イントロ
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
カラムを参照したいんだな」
と判断してくれます。
なので外部キー制約を指定するときは命名法に注意しましょう!