Laravel Eloquent ORM - удаление строк и всех дочерних отношений с удалением события

У меня есть три модели, которые относятся друг к другу одна ко многим:

Страна

class Country extends Model
{
    protected $fillable=['name','sort'];
    public $timestamps=false;

    public function region(){
        return $this->hasMany('App\Models\Region');
    }
}

Область, край

class Region extends Model
{

    protected $fillable=['country_id','name','sort'];
    public  $timestamps=false;

    public function country()
    {
        return $this->belongsTo('App\Models\Country');
    }

    public function city()
    {
        return $this->hasMany('App\Models\City');
    }
}

город

class City extends Model
{
    protected $table='cities';
    protected $fillable=['region_id','name','sort'];
    public  $timestamps=false;

    public function region()
    {
        return $this->belongsTo('App\Models\Region');
    }
}

Когда мы автоматически удаляем страну, удаляем все связи дочерних элементов, то есть удаляемые регионы и города этой страны

Я делаю так:

Модель Страна

    public  static function boot() {
        parent::boot();

        static::deleting(function($country) {
            //remove related rows region and city

            // need an alternative variation of this code
            $country->region()->city()->delete();//not working
            $country->region()->delete();

            return true;
        });
    }
}

ИЛИ ЖЕ

Модельный регион

public  static function boot() {
        parent::boot();
        // this event do not working, when delete a parent(country)
        static::deleting(function($region) {
            dd($region);
            //remove related rows city
            $region->city()->delete();
            return true;
        });
    }
}

варианты с каскадным удалением базы данных просьба не предлагать

ОБНОВИТЬ

Я нашел ответ

использовать замыкание для построителя запросов, чтобы удалить связанные модели

Модель Страна

public  static function boot() {
        parent::boot();

        static::deleting(function($country) {
            //remove related rows region and city
            $country->region->each(function($region) {
                $region->city()->delete();
            });
            $country->region()->delete();//
            return true;
        });
    }

Laravel Eloquent ORM - удаление строк и всех внутренних связей

2 ответа

Просто быстрое резюме:

$model->related_model вернет связанную модель.
$model->related_model() вернет объект отношения.

Вы можете сделать либо $model->related_model->delete() или же $model->related_model()->get()->delete() чтобы получить доступ к delete() метод по модели.

Другой способ обработки удаления связанных (или под) моделей - использование ограничений внешнего ключа при написании миграций. Проверьте https://laravel.com/docs/master/migrations.

привет мой друг, я думаю, вы можете сделать это в функции удаления родительского объекта:

      public function destroy_parent($id)
{
    $parent = PARENT::find($id);
    foreach ($parent->childs as $child){
            $child->delete();
    }
    $parent->delete();
    return redirect(...);
        
}
Другие вопросы по тегам