migrationで指定できる外部キー制約の種類
Update時 (=リレーション先のキーが更新された場合) | Delete時 (=リレーション先が削除された場合) | |
CASCADE | リレーション先と一緒に自動更新 | リレーション先と一緒に自動削除 |
SET NULL | NULLが設定される | NULLが設定される |
RESTRICT | エラーになる | エラーになる |
CASCADEに関する補足
例えば、users.id
= 1, posts.user_id
= 1のリレーションデータがあった場合
users.id
が2に変更になった場合
→posts.user_id
も2
に更新されるusers.id
が1のデータが削除された場合
→posts.user_id
が1の全てのpostsレコードが自動削除される
わざわざリレーションを更新するコードを書かなくて済むので便利
migrationへの記載方法
Schema::create('posts', function (Blueprint $table) {
$table->id();
// 外部キーを設定するカラム
$table->unsignedBigInteger('user_id')->comment('ユーザーID');
// CASCADEの場合
$table->foreign('user_id')->references('id')->on('users')->onUpdate('CASCADE')->onDelete('CASCADE');
// SET NULLの場合
$table->foreign('user_id')->references('id')->on('users')->onUpdate('SET NULL')->onDelete('SET NULL');
// RESTRICTの場合
$table->foreign('user_id')->references('id')->on('users')->onUpdate('RESTRICT')->onDelete('RESTRICT');
});
SET NULLにする場合は、下記のように対象のカラムをnullable()にしておく必要がある
$table->unsignedBigInteger('user_id')->comment('ユーザーID')->nullable();
CASCADEに関しては、cascadeOnUpdate
, cascadeOuDelete
記法も使用可能
$table->foreign('user_id')->references('id')->on('users')->cascadeOnUpdate()->cascadeOnDelete();
外部キーを削除したい場合
dropForeign('外部キー名')
メソッドを使う
( 外部キー名 = 'テーブル名' + 'カラム名' + '_foreign' )
$table->dropForeign('posts_user_id_foreign');
// 配列にカラム名を渡してもOK
$table->dropForeign(['user_id']);
migrationするとき、相対テーブルのカラムに外部キーを設定すると便利