「外部キー制約したい」と思った時に、毎度ネットサーフィンするのが面倒なので、参照用として記録しておきます。
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;
これで完了です。
今後はこの流れでリレーションについてもまとめていきたいと思います。
暗記しちゃって、バチバチ開発スピードを上げていきたいです😌