这甚至可能吗? 在我阅读的每个教程中,没有关于删除,只选择和插入相关模型的内容。
这是我的问题:
我有三个级别的嵌套。我有课程包,课程,课程和阶段,他们的模型如下。第一个 - 包:
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发推文并问他解决方案:)提前谢谢
答案 0 :(得分:3)
您可以通过两种方式解决此问题:
利用数据库为您执行删除操作。您可以分别为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();
});
}
}
答案 1 :(得分:0)
我认为您可以在{1}}中使用foreign keys
。我还没有使用Laravel的ORM,但有一个section in documentation描述了如何在迁移中创建外键。
或者您可以尝试this answer中建议的技巧。我们的想法是覆盖drop cascade
方法并强制删除相关对象。