こんにちは。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でも情報発信をしていますので、よかったらフォローをお願いします(^^)