Реляционное удаление 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.

Другие вопросы по тегам