LoginSignup
3
1

More than 1 year has passed since last update.

Laravelで外部キー制約したいんですけどっ!??

Posted at

イントロ

Laravelでテーブルのカラムに外部キー制約を実装する方法を紹介するZE☆

俺「外部キー制約ってなんやねん」

って方はこちらで詳しく解説しています!

こちらの記事はLaravelドキュメントのマイグレーションにある外部キー制約の段落を分かりやすく噛み砕いたものになります。

今回解説するLaravelのバージョンは8.xです!

migrationを操作する方法が2つあるよ!

Laravelでカラムに外部キー制約を実装するには、migrationを操作する必要があります!

migrationでの設定方法は大きく分けて2つ方法があります!

今回はドキキュメントに沿ってusersテーブルとpostsテーブルを例に紹介します。

今まで通りの方法

まずは今までのマニュアル通りの方法を紹介します。

実際のコードを見てみましょう。

databases/migration/create_〇〇_table.php
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');のようにして外部キー制約を実装します。

  1. foreign('xxx')で外部キー制約したいカラムを指定
  2. references('yyy')で参照したい外部のカラム名を指定
  3. 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_idforeignidメソッドに与えると、contrainedメソッドは

user_idだから、usersテーブルのidカラムを参照したいんだな」

と判断してくれます。

なので外部キー制約を指定するときは命名法に注意しましょう!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1