【Laravel】親を削除したら孫まで削除する
課題
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は子側なので削除しちゃダメ)