こんにちはー!むちょこです。
今日はマイグレーションファイルへの外部キー制約の書き方をご紹介したいと思います。
特に Laravel 7.x 以降からは便利な書き方が追加されていますので、まだ知らなかった方は要チェックです!
下の例はどちらのバージョンも「posts テーブルの user_id カラムが users テーブルの id カラムを参照する」という条件で定義しています。
6.x 以前
カラムを定義してから、外部キー制約についての定義を加えます。
Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id')->nullable();
$table->foreign('user_id')->references('id')->on('users');
});
解説
$table->unsignedBigInteger('user_id')->nullable();
unsingedBigInteger(): カラム生成メソッドです。カラム名を引数にします。users テーブルの id カラムと同じ型がつくれるカラム生成メソッドを選択してください。この例では符号なしの BIGINT 型を選択しました。
nullable(): カラム修飾子です。つけなくても構いません。カラム修飾子をつけるときは、カラム生成メソッドの後に繋げます。この例では null を許可する修飾子をつけてみました。
$table->foreign('user_id')->references('id')->on('users');
foreign(): 外部キー制約をつけるメソッドです。 posts テーブルの対象カラム名を引数にします。
references(): 参照先のカラムを指定するメソッドです。 users テーブルの対象カラム名を引数にします。
on(): 参照先のテーブルを指定するメソッドです。対象のテーブル名を引数にします。
上記で、「 posts テーブルの user_id カラムは users テーブルの id カラムを参照する」という定義になります。
7.x 以降
カラムの定義と外部キー制約の定義をまとめて行えるメソッドが追加されました。
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->nullable()->constrained();
});
解説
$table->foreignId('user_id')->nullable()->constrained();
foreignId(): 外部キー制約つきのカラムを生成するメソッドです。 posts テーブルの対象カラム名を引数にします。型は unsignedBigInteger() と同じになります。
nullable(): カラム修飾子です。つけなくても構いません。カラム修飾子をつけるときは、カラム修飾子は constrained() の前に繋げます。この例では null を許可する修飾子をつけてみました。
constrained(): 参照先を指定するメソッドです。参照先のテーブル名を引数にします。 foreignId() で「 {参照先テーブルの単数形}_id 」というルールに則ったカラム名をつけたときは引数なしで設定できます。
foreignId() を実装しているソースコードはこちら。
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Database/Schema/Blueprint.php#L918
型を指定したいとき
foreignId() を使うと、型は必ず 符号なしの BIGINT 型なります。
任意の型にしたい場合は Laravel 6.x 以前からの書き方で個別に実行すれば大丈夫です!