0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

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;

これで完了です。

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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?