🌟

Laravelの外部キー制約についてまとめた

2022/12/17に公開

「外部キー制約したい」と思った時に、毎度ネットサーフィンするのが面倒なので、参照用として記録しておきます。

Version → 8.83.26
PHP → 8.1.12

外部キー制約の追加

手順

①親テーブル(parents)のマイグレーションファイル作成→migrate実行(特別な作業がないので省略)
②子テーブル(childs)のマイグレーションファイル作成

$ php artisan make:migration create_childs_table

③外部キー制約の追加(ここが肝)

Schema::create('childs', function (Blueprint $table) {
    $table->id();
// ↓ ここに追記
    $table->foreignId('parent_id')->constrained('parents')->cascadeOnUpdate()->cascadeOnDelete();
});

ポイント

foreignId()→constrained()で外部キー制約に関する記述をしています。
なおかつcascadeOnUpdate()…で親テーブルが削除されると子テーブルも同時に削除されるように設定しています。

CASCADE: 親テーブルの行を削除または更新し、子テーブル内の一致する行を自動的に削除または更新します。ON DELETE CASCADE と ON UPDATE CASCADE の両方がサポートされています。2 つのテーブル間で、親テーブルまたは子テーブル内の同じカラムに対して機能する複数の ON UPDATE CASCADE 句を定義しないでください。

参考:MySQL公式

※別の記述方法

書き方としてはもう一つあって、外部キー制約の部分を以下にしても成功します。

$table->unsignedBigInteger('parent_id');
$table->foreign('parent_id')->references('id')->on('parents');

この方法でも制約を追加できますが、二行になるので最初の記述がおすすめです。

補足(中間テーブルの場合)

これも難しくなくて、親テーブルが複数なので、もう一行追加すればOK。

Schema::create('childs', function (Blueprint $table) {
    $table->id();
// ↓ ここに追記
    $table->foreignId('parent1_id')->constrained('parents1')->cascadeOnUpdate()->cascadeOnDelete();
		$table->foreignId('parent2_id')->constrained('parents2')->cascadeOnUpdate()->cascadeOnDelete();
});

migrate実行

$ php artisan migrate;

これで完了です。

今後はこの流れでリレーションについてもまとめていきたいと思います。
暗記しちゃって、バチバチ開発スピードを上げていきたいです😌

Discussion