従来の削除と論理削除 (SoftDelete) の違い
何も設定しない場合の削除は「物理削除」となり、レコード自体が消滅する
この削除方法だと、$item->delete()
するだけで、
外部キーにonDelete('cascade')
が設定されている関連データも自動削除してくれる
一方、今回の「論理削除」は、テーブルにdeleted_at
カラムを追加し、
そこに値が入っていれば削除されている (削除フラグがON) という考え方
よって、$item->delete()
実行時にはレコードは削除されずに削除日時に値が入る
便利だけど、リレーションデータも論理削除設定の場合、
上記のように親元データを削除した際に自動削除がされないことに気づいた...
対処法
「laravel-soft-cascade」を利用する
- composerでパッケージインストール
composer require askedio/laravel-soft-cascade
- リレーションデータも論理削除したい親元モデルに追記
class Item extends Model
{
use HasFactory, SoftDeletes;
// ⭐️ 追記
use \Askedio\SoftCascade\Traits\SoftCascadeTrait;
// ⭐️ 追記 (一緒に削除したいリレーション名を配列で指定)
protected $softCascade = ['images', 'categories'];
これだけで、親データが削除されたときに紐づくデータも論理削除されるようになる、超便利
Laravelで、migration作成時に外部キーに
onDelete('cascade')
を設定これで、親データを削除するだけで関連データも自動的に削除される
しかし論理削除 (SoftDelete) のリレーションは削除されなかった...