Реляционное удаление 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, потому что я пытался добавить плашку; в функции, но она никогда не умирает.

Кто-нибудь знает, как я могу это преодолеть? Спасибо


person Thoma Biguères    schedule 23.03.2014    source источник


Ответы (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.

person bgallagh3r    schedule 23.03.2014