这可能吗?在我读到的每个教程中,都没有关于删除的内容,只有选择和插入相关模型。
这是我的问题:
我有三个级别的嵌套。我有课程包,级别,课程和阶段,它们的模型如下。第一个 - 包:
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');
}
}
课:
类 课 扩展 雄辩 {
protected $table = 'lessons';
public function phases(){
return $this->hasMany('Phase', 'lesson_id');
}
public function level(){
return $this->belongsTo('Level', 'level_id');
}
}
我在这里要做的是在删除一个包时,我删除了与之相关的所有级别,并删除了与这些级别相关的所有课程。
我已经尝试了几个选项,但它们都错了,我只是不知道如何在 foreach 循环中进行一堆查询的情况下做到这一点。请给我一些建议,我非常绝望,我正在考虑发推文给杰弗里·韦,并要求他提供解决方案:)提前致谢
您可以通过两种方式解决此问题:
-
利用数据库为您执行删除操作。您可以分别在
lessons
、levels
和packages
的迁移中添加类似的东西:$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');
-
您可以覆盖每个模型上的
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(); }); } }
我认为您可以在您的情况下将foreign keys
与drop cascade
一起使用。我还没有使用过 Laravel 的 ORM,但文档中有一节描述了如何在迁移中创建外键。
或者您可以尝试此答案中建议的技术。这个想法是覆盖delete
方法并强制删除相关对象。