Laravel三个模型之间的关系删除

时间:2014-03-23 18:32:47

标签: orm laravel laravel-4 relational-model

我有一个简单的关系模型,我已经建立了这样的模型: 家长:

    <?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时,我想删除图库和与appartement相关的图像。

所以我试图覆盖删除方法。 公寓被删除,以及图库,但图像不会被删除,似乎没有访问Gallery的删除功能,因为我已经尝试添加模具;在功能,但它永远不会死。

有谁知道如何克服这个问题? 感谢

1 个答案:

答案 0 :(得分:0)

您有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');   
});

另一种选择是使用model observers 这是一个示例:http://www.laravel-tricks.com/tricks/cascading-deletes-with-model-events这对不支持FK约束的数据库非常有用。