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(...);
}