LoginSignup
19
15

More than 3 years have passed since last update.

【Laravel】親を削除したら孫まで削除する

Posted at

課題

Eloquentで
親(Parent) - 子(Child) - 孫(Grandchild)のリレーションがあるとき、
親を削除したら子と孫も削除したい。

準備

親と子にモデルイベントを定義しておく

親を削除したら子が削除されるように親モデルにdeletingを定義。

Parent.php
protected static function boot() 
{
    parent::boot();
    static::deleting(function($model) {
        foreach ($model->$children()->get() as $child) {
            $child->delete();
        }
    });
}

子を削除したら孫が削除されるように子モデルにdeletingを定義。

Child.php
protected static function boot() 
{
    parent::boot();
    static::deleting(function($model) {
        foreach ($model->$grandchildren()->get() as $child) {
            $child->delete();
        }
    });
}

実行

親を削除

$parents = Parents::where('xxx', true)->get();
foreach ($parents as $parent) {
    $parent->delete();
}

※クエリによる一括削除ではモデルイベントを発行しないため、getして一つずつ削除する必要がある

改善したいこと

foreach ($model->$children()->get() as $child) {

↓

foreach (['children', 'children2', 'children3'] as $relation) {
    foreach ($model->$relation()->get() as $child) {

にすれば子が複数の場合も対応できるのだけど、いっそ['children', 'children2', 'children3']を動的に取りたい。

hasOneとhasManyの定義を取得する方法あるのかな?(※belongsToは子側なので削除しちゃダメ)

19
15
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
19
15