Laravel

Laravel 外部キー制約の設定方法【2つの方法を解説】

こんにちは。Laravelエンジニアのタクマです。

今回は、Laravelで外部キー制約を設定する方法を解説します。

・外部キー制約の設定方法がわからない

・外部キー制約ってなに?

こんなお悩みを解決できる記事となっております。

それではさっそく解説していきます。

foreign() references() on()を使った書き方

パターン1

foreign() references() on()を使った書き方です。

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('articles', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

上記のように書くことで、articlesテーブルのuser_idは、usersテーブルに保存されているidしか登録できなくなります。

つまり、存在するuserのidしか登録できなくなるので整合性が保てるようになり、これが外部キー制約です。

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('articles', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

また上記のように->onDelete('cascade')をつけることによって、userが削除された際に、userに紐づくarticleも一緒に削除されるようになります。

foreignId() constrained()を使った書き方

パターン2

foreignId() constrained()を使った書き方です。

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('articles', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

上記のように書くことで、articlesテーブルにuser_idのカラムを登録でき、且つusersテーブルに存在しているidしか登録できない外部キー制約も設定されている状態になります。

先に紹介したforeign() references() on()を使った書き方に比べてかなり簡潔に書けるようになりましたね。

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('articles', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
});

またforeignId() constrained()を使った書き方も、上記のように->onDelete('cascade')をつけることによって、userが削除された際に、userに紐づくarticleも一緒に削除されるようになります。

注意点としまして、こちらのforeignId() constrained()を使った書き方はLaravel7以降でしか使えません。

なので、Laravel7以降でしたらforeignId() constrained()を使った書き方で外部キー制約を設定することをオススメします。

さいごに

いかがでしたでしょうか。

外部キー制約の設定方法について理解できましたでしょうか?

ご質問やご指摘等ある方はコメントしていただければ返信させていただきます。

これからもLaravelエンジニアの方、Laravel学習中の初学者の方に役に立つ記事を更新していきますのでよろしくお願いします!

Twitterでも情報発信をしていますので、よかったらフォローをお願いします(^^)

Webエンジニア
タクマ
埼玉県出身の33歳

新卒で入社した専門商社で8年間営業職として勤務

30歳からプログラミングを始め31歳でWebエンジニアに転職成功

受託開発企業での開発を1年弱経験したのち、現在はスタートアップの自社開発企業で開発に従事している
\ Follow me /

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA