在 Laravel 中一对多删除相关模型
Posted
技术标签:
【中文标题】在 Laravel 中一对多删除相关模型【英文标题】:Deleting related models one-to-many in Laravel 【发布时间】:2015-02-01 03:40:48 【问题描述】:这甚至可能吗? 在我阅读的每个教程中,都没有关于删除的内容,只是选择和插入相关模型。
这是我的问题:
我有三层嵌套。我有课程包、级别、课程和阶段,它们的模型如下。第一个 - 包:
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 发推文并询问他的解决方案:) 在此先感谢
【问题讨论】:
【参考方案1】:您可以通过两种方式解决此问题:
利用数据库为您执行删除操作。您可以分别在 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();
);
【讨论】:
关于第二种方法需要考虑的一点:最好将调用delete()
包装在事务中,以避免在任何查询失败时出现不一致。
绝对是个好主意 @Bogdan。编辑以包含交易
值得注意的是:第一个选项根本不适用于softDeletes
,第二个选项不会使用softDeletes
(它将运行原始删除)。
谢谢@edopaez 我使用了你的解决方案。首先,我不得不深入研究一下迁移,并感谢你,因为我现在知道更多,在你的帖子之前:) 抱歉,我迟到了,顺便说一句【参考方案2】:
我认为你可以在你的情况下使用foreign keys
和drop cascade
。我还没有使用过 Laravel 的 ORM,但是有一个 section in documentation 描述了如何在迁移中创建外键。
或者您可以尝试this answer 中建议的技术。思路是重写delete
方法,强制删除相关对象。
【讨论】:
以上是关于在 Laravel 中一对多删除相关模型的主要内容,如果未能解决你的问题,请参考以下文章