【Laravel】migration時に外部キーを設定する

えびさん

migrationするとき、相対テーブルのカラムに外部キーを設定すると便利

migrationで指定できる外部キー制約の種類

Update
(=リレーション先のキーが更新された場合)
Delete
(=リレーション先が削除された場合)
CASCADEリレーション先と一緒に自動更新リレーション先と一緒に自動削除
SET NULLNULLが設定されるNULLが設定される
RESTRICTエラーになるエラーになる

CASCADEに関する補足

例えば、users.id = 1, posts.user_id = 1のリレーションデータがあった場合

  • users.id2に変更になった場合
    posts.user_id2に更新される
  • users.id1のデータが削除された場合
    posts.user_id1の全ての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']);