外部キーの準備
通常、外部キーは相手方テーブルで自動連番として生成されたキーを対象とすることが多い。
例えば参照先のテーブルのプライマリーキーが'id'
であるとして、これがAuto Incrementの場合にはマイグレーションファイルでは以下のように定義される。
$table->bigIncrements('id');
これにより生成されるカラムのデータ型はunsignedBigInteger
となるので、参照元のテーブルで外部キーを設定するときは以下のように定義する。
$table->unsignedBigInteger('参照先テーブル名の単数形_id');
例えば参照先テーブルをcustomers
とすると、マイグレーションファイルでは以下のように書かれる。
1 2 3 4 5 6 7 8 9 10 11 |
class CreateCustomersTable extends Migration { public function up() { Schema::create('customers', function (Blueprint $table) { $table->bigIncrements('id'); ........ }); } ........ } |
orders
テーブルから上記のcustomers
テーブルを参照する場合、orders
テーブルの外部キーは以下のように記述する。
1 2 3 4 5 6 7 8 9 10 11 12 |
class CreateOrdersTable extends Migration { public function up() { Schema::create('orders', function (Blueprint $table) { $table->bigIncrements('id'); $table->unsignedBigInteger('customer_id'); ........ }); } ........ } |
外部キーの設定
Laravelのモデルに外部キーを設定する場合、マイグレーションファイルでforeign()
メソッドを使う。
具体的には、テーブルを作成するクラスのup()
メソッドで呼ばれるSchema::create()
メソッド内に以下を記述。
$table->foreign('外部キー')->references('参照キー')->on('参照テーブル');
外部キー制約
マイグレーションファイルで外部キーを設定した場合、デフォルトの外部キー制約はRESTRICT
になる。この制約をCASCADE
やSET NULL
に変更することができる。
削除、更新に対する制約はonDelete()
、onUpdate()
をメソッドチェーンに追加して設定する。
1 2 |
$table->foreign('外部キー')->references('参照キー')->on('参照テーブル') ->onDelete('CASCADE')->onUpdate('CASCADE'); |
引数は大文字でも小文字でもよく、CASCADE
、SET NULL
、RESTRICT
の何れかを指定する。
コード例
たとえば.投稿記事のPost
モデルのテーブルがuser_id
カラムを持ち、ここにUsers
モデルのid
を外部キーとする場合、Post
のマイグレーションファイルのCreatePostsTable
クラスのup()
メソッドに、外部キー設定の行を記述する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class CreatePostsTable extends Migration { public function up() { Schema::create('posts', function (Blueprint $table) { $table->bigIncrements('id'); // ユーザーIDの外部キー $table->unsignedBigInteger('user_id'); ........ $table->foreign('user_id')->references('id')->on('users') ->onUpdate('cascade') ->onDelete('cascade'); }); } ........ } |