【Laravel】onDelete(‘cascade’)してるのにリレーションデータが論理削除されない

えび

Laravelで、migration作成時に外部キーにonDelete('cascade')を設定
これで、親データを削除するだけで関連データも自動的に削除される
しかし論理削除 (SoftDelete) のリレーションは削除されなかった

従来の削除と論理削除 (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'];

これだけで、親データが削除されたときに紐づくデータも論理削除されるようになる、超便利