在 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】:

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

    利用数据库为您执行删除操作。您可以分别在 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');
    

    您可以覆盖每个模型上的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 keysdrop cascade。我还没有使用过 Laravel 的 ORM,但是有一个 section in documentation 描述了如何在迁移中创建外键。

或者您可以尝试this answer 中建议的技术。思路是重写delete方法,强制删除相关对象。

【讨论】:

以上是关于在 Laravel 中一对多删除相关模型的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4雄辩的一对多关系

laravel的模型关联之(一对多的反向)

#ASK Laravel 深厚的口才关系,来自患者一对多注册一对一综合诊所

记录一次laravel 模型关联 一对一, 一对多 取数据

laravel 模型中的一对一,一对多,多对多的关联

无法删除一对多关系中的记录 laravel eloquent