【问题标题】:Laravel eloquent static boot deleting multiple relationshipLaravel eloquent 静态启动删除多重关系
【发布时间】:2017-08-03 13:43:15
【问题描述】:

我有这个模型,它使用静态启动来删除数据库中的相关模型/表。 首先是产品型号。

 protected static function boot() {
    parent::boot();

    static::deleting(function($product) {
        $product->hearts()->delete();
        $product->comments()->delete();
    });
}

它会删除红心和 cmets,它的作用就像一个魅力。但问题是我有这个回复模型,它与我的评论模型有关系,并且回复模型是从评论模型中引用的

public function replies()
{
    return $this->hasMany("App\Reply");
}

然后在我的评论模型中,我使用另一个静态引导来“链接”产品中的引导删除

 protected static function boot() {
    parent::boot();

    static::deleting(function($comment) { 
        $comment->replies()->delete();
    });
}

但它不起作用。你们能告诉我为什么这不起作用吗?从逻辑上讲,它应该可以工作,因为评论正在被删除。谢谢。

【问题讨论】:

  • 不,我不想做一个 foreach 循环,因为这对大数据需要太多的处理。
  • 我认为 Laravel 甚至不会构造它删除的模型,因此它也不会调用 static::deleting 方法..您还必须删除产品 ::deleting 中的评论回复。
  • 这行不通。 $product->cmets()->replies()->delete();有任何想法吗?不诉诸foreach?
  • 如果您使用的是 mysql,请尝试使用 on delete cascade,这是在您从父表中删除数据时,外键从子表中删除数据的参考操作。链接:mysqltutorial.org/mysql-on-delete-cascade
  • 嗯.. 我们在 MySQL 或您在工作中使用的任何 db 中使用级联删除.. 我认为如果没有循环它就无法工作:/

标签: laravel eloquent


【解决方案1】:

这对我有用

static::deleting(function($product) {
   $product->comments->each->delete()
});

【讨论】:

    【解决方案2】:

    在您的第一个deleting 事件中,您正在调用$product->comments()->delete();。这一行实际上是在查询构建器对象上调用delete() 方法,而不是Comment 模型。因为删除过程中没有创建Comment模型,所以Comment上的deleting事件不会被执行。

    为了执行这种类型的应用程序级级联删除,您需要确保仅在 Comment 实例上调用删除。您可以遍历相关记录并删除它们,或者获取它们的 id 列表并使用 destroy() 方法(在后台执行循环):

    // do a loop yourself
    static::deleting(function($product) {
        foreach ($product->comments as $comment) {
            $comment->delete();
        }
    });
    
    // or, destroy all the ids
    static::deleting(function($product) {
        $ids = $product->comments()->lists('id')->all();
        Comment::destroy($ids);
    });
    

    话虽如此,如果您有简单的关系和修改数据库的权限,您可能希望设置数据库级级联删除。这将比应用程序级级联删除快得多,因为您不需要为要删除的每条记录加载每个模型。

    但是,如果您需要应用程序级级联删除(例如多态关系、应用程序架构师需要它们等),我确实有一个包可以为您解决这个问题:shiftonelabs/laravel-cascade-deletes。您只需向模型添加一个特征并定义要级联删除的关系数组,您无需担心其他任何事情。

    【讨论】:

    • 如何获取 $request ??
    猜你喜欢
    • 2015-05-14
    • 2015-05-19
    • 2015-04-03
    • 2022-01-24
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多