在Laravel中一对多删除相关模型

时间:2014-12-03 14:20:44

标签: php laravel laravel-4

这甚至可能吗? 在我阅读的每个教程中,没有关于删除,只选择和插入相关模型的内容。

这是我的问题:

我有三个级别的嵌套。我有课程包,课程,课程和阶段,他们的模型如下。第一个 - 包:

class Package extends Eloquent  {

protected $table = 'packages';
public $timestamps = false;

public function levels(){
    return $this->hasMany('Level', 'package_id');
}

}

位:

class Level extends Eloquent  {

protected $table = 'levels';

public function lessons(){
    return $this->hasMany('Lesson', 'level_id');
}

public function package(){
    return $this->belongsTo('Package', 'package_id');
}

}

经验:

课程课程扩展了Eloquent {

protected $table = 'lessons';

public function phases(){
    return $this->hasMany('Phase', 'lesson_id');
}

public function level(){
    return $this->belongsTo('Level', 'level_id');
}

}

我在这里要做的是删除一个包时删除与其相关的所有级别,并删除与这些级别相关的所有课程。

我已经尝试了几个选项并且它们都错了,我只是不知道如何在foreach循环中进行一堆查询时这样做。 请给我一些建议我很绝望我正在考虑给Jeffrey Way发推文并问他解决方案:)提前谢谢

2 个答案:

答案 0 :(得分:3)

您可以通过两种方式解决此问题:

  1. 利用数据库为您执行删除操作。您可以分别为lessonslevelspackages的迁移添加类似内容:

     $table->foreign('level_id')->references('id')->on('levels')->onDelete('cascade');
    
     $table->foreign('lesson_id')->references('id')->on('lessons')->onDelete('cascade');
    
     $table->foreign('package_id')->references('id')->on('packages')->onDelete('cascade');
    
  2. 您可以覆盖每个模型上的delete方法以删除其所有关系:

    class Lesson extends Eloquent {
    
        protected $table = 'lessons';
    
        public function phases(){
            return $this->hasMany('Phase', 'lesson_id');
        }
    
        public function level(){
            return $this->belongsTo('Level', 'level_id');
        }
    
        public function delete()    
        {
            DB::transaction(function() 
            {
                $this->level()->delete();
                $this->phases()->delete();
                parent::delete();
            });
        }
    
    }
    

答案 1 :(得分:0)

我认为您可以在{1}}中使用foreign keys。我还没有使用Laravel的ORM,但有一个section in documentation描述了如何在迁移中创建外键。

或者您可以尝试this answer中建议的技巧。我们的想法是覆盖drop cascade方法并强制删除相关对象。