【Laravel】親のデータが削除されたら子のデータも削除する「->onDelete(‘cascade’)」
->onDelete(‘cascade’)は、データベースのテーブル同士を紐づける「外部キー制約」において、「親のデータが削除されたら、それに連動してこのデータも自動的に削除する」という仕組み(連鎖削除)を設定するためのものです。
Laravelのマイグレーションファイルで非常によく使われます。
具体例
例えば、「ユーザー(user)」とそのユーザーが書いた「記事(post)」のテーブルがあるとします。
親テーブル:users(ユーザー)
子テーブル:posts(記事。誰が書いたかを示すuser_idを持っている)
もし、あるユーザーが退会(アカウント削除)したとき、この->onDelete(‘cascade’)を設定しているかどうかで挙動が以下のように変わります。
onDelete(‘cascade’)を設定している場合(連動して削除)
親であるユーザーを削除すると、そのユーザーが書いた記事もデータベースが自動的にすべて削除してくれます。
設定していない場合(エラーまたはごみが残る)
親のユーザーを削除しようとすると、データベースから「そのユーザーに紐づいている記事(子)がまだ残っているから削除できない」と怒られてエラーになるか、設定によっては持ち主のいない「孤立したごみ記事」がデータベースに残ってしまいます。
Laravelでの書きかた
Schema::create('posts', function (Blueprint $table)) {
$table->id();
$table->foreignId('user_id')
->constrained()
->onDelete('cascade');
$table->string('title');
$tabe->text('content');
$table->timestamps();
}
使うときの注意点
非常に便利ですが、実務で使う場合は以下の点に注意が必要です。
データの誤削除リスク:
管理者が誤って親データ(例:企業アカウント)を削除してしまった場合、そこに紐づいていた膨大なデータ(例:社員データ、売上データ、何千件ものログなど)が一瞬で、あとかたもなく自動消滅します。
論理削除(SoftDeletes)との兼ね合い:
LaravelのSoftDelete(データを完全に削除せずにdelete_atに日時を入れる機能)を使っている場合、データベースのonDelete(‘cascade’)は連動しません。親が論理削除されても、子テーブルはそのまま残ります。そのため、論理削除を使う場合はLaravelのイベント(モデルイベントのdeletingなど)を使ってコード側で連動させるのが一般的です。
「退会したらその人の投稿やコメントは全部消えていい」というような、完全に連動させたいシンプルな親子関係の時に強力な威力を発揮する設定です。
株式会社オートプロジェクトでは、バックエンド全般を安心してお任せいただけます。
サーバー設定やDB管理、セキュリティ対策など幅広いニーズに対応いたします。お気軽にご相談ください。

EC用公式アカウント