課題

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は子側なので削除しちゃダメ)