Laravel 4 级联软删除

Posted

技术标签:

【中文标题】Laravel 4 级联软删除【英文标题】:Laravel 4 Cascading Soft Deletes 【发布时间】:2013-06-19 01:55:57 【问题描述】:

在 L4 中是否有一种模块化的方式来执行级联软删除?

我的数据库已经设计为通过硬删除来执行此操作,因为所有表都与另一个表相关。但是,我正在使用软删除并且真的不想在我的模型中重载 delete() 方法 - 只是由于 (A) 模型的数量,以及 (B) 当其他模型发生变化时,必须在所有模型中编辑 delete() 方法。

任何指针或提示将不胜感激。

【问题讨论】:

【参考方案1】:

我知道这在我的模型中是可能的:

public function delete() 
  ChildTable::where('parent_id', $this->id)->delete();
  ChildTable2::where('parent_id', $this->id)->delete();
  parent::delete();

但是对模型或表结构的任何更新都会导致它被追加/编辑..包括其他模型。

【讨论】:

这是您问题的答案还是部分问题? Both:它代表一种手动级联删除(或重新分配父表child_id)的方法。但是,这种删除的模块化方式会很好;例如 Eloquent 如何处理人际关系。我的意思是..关系已经存在,那么为什么不尝试对定义的关系执行级联软删除呢? ***.com/a/14176326/3986937 @Chris Schmitz 指出您可以在迁移中添加此行为。【参考方案2】:

我已经使用model events 进行级联删除工作,例如在产品模型中我绑定到已删除事件,因此我可以软删除所有关系:

    // Laravel's equivalent to calling the constructor on a model
    public static function boot()
    
        // make the parent (Eloquent) boot method run
        parent::boot();    

        // cause a soft delete of a product to cascade to children so they are also soft deleted
        static::deleted(function($product)
        
            $product->images()->delete();
            $product->descriptions()->delete();
            foreach($product->variants as $variant)
            
                $variant->options()->delete();
                $variant->delete();
            
        );
    

【讨论】:

Taylor 还 recommends 使用 Model::deleting() 和 Model::deleted() 处理程序 Chris Schmitz 指出您可以在迁移中添加此行为***.com/a/14176326/3986937

以上是关于Laravel 4 级联软删除的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel 5.8级联删除

Laravel:级联删除模型,如果没有其他模型共享它

在laravel 5.1单元测试中嘲笑hasMany关系

Laravel:自定义或扩展通知 - 数据库模型

Laravel 4.2 MethodNotAllowedHttpException 删除

Laravel 4 从 URL 中删除公共