Реляционное удаление Laravel между тремя моделями
У меня есть простые реляционные модели, которые я построил так: Parent:
<?php
class Appartement extends Eloquent {
public function gallery()
{
return $this->hasOne('Gallery', 'object_id')->where('type', '=', 'appartement');
}
public function delete()
{
$this->gallery()->delete();
return parent::delete();
}
}
Первая детская галерея
class Gallery extends \Eloquent {
protected $fillable = [];
public function images()
{
return $this->hasMany('GalleryImage');
}
public function delete()
{
$this->images()->delete();
return parent::delete();
}
}
Вторые детские изображения
class GalleryImage extends \Eloquent {
protected $fillable = [];
public function gallery()
{
return $this->belongsTo('Gallery');
}
public function delete()
{
unlink(public_path().$this->link);
return parent::delete();
}
}
Так что в принципе ничего особенного: одна квартира имеет одну галерею, одна галерея имеет много изображений. Это работает довольно хорошо, проблема в том, что когда я удаляю квартиру, я хотел бы удалить галерею и изображения, связанные с квартирой.
Поэтому я попытался переопределить метод удаления. Appartement удаляется, также как и галерея, но изображения не удаляются, и кажется, что нет доступа к функции удаления Gallery, потому что я пытался добавить штамп; в функции, но он никогда не умирает.
Кто-нибудь знает, как мне это преодолеть? Спасибо
1 ответ
У вас есть 2 варианта, во-первых, установить ограничения внешнего ключа и каскад при удалении, используя ваши миграции
// gallery migration
DB::table('galleries', function($table){
$table->foreign('object_id')
->references('id')->on('appartments')
->onDelete('cascade');
});
// images migration
DB::table('images', function($table){
$table->foreign('gallery_id')
->references('id')->on('galleries')
->onDelete('cascade');
});
Другой вариант заключается в использовании наблюдателей модели, вот пример: http://www.laravel-tricks.com/tricks/cascading-deletes-with-model-events это полезно на БД, которые не поддерживают ограничения FK.