【问题标题】:Deleting nested comments and related data from laravel controller从 laravel 控制器中删除嵌套评论和相关数据
【发布时间】:2019-08-29 06:13:08
【问题描述】:

我在 laravel 中使用 parent_id 实现了嵌套 cmets,并且还有另一个表 votes 存储相关数据。

我在 cmets 模型中定义了很多关系。现在,当我删除评论时,它也应该删除所有回复和投票。

删除我使用的投票

$review->votes()->delete(); 

效果很好。但我坚持删除嵌套回复的投票。

如果我使用 foreach 循环,如何在所有动态级别内循环。

public function deletereview($id=null){

    $review = Review::find($id);

    foreach($review->replies as $reply){
        $reply->votes()->delete();
        //how to do this for all levels?
        $reply = $reply->votes(); // this doesn't work
    }
    return back();
}

请就正确的做法提出建议。

注意:我已经阅读了迁移中的级联选项,但这并不能解释嵌套 cmets 的任何内容(回复回复及其相关数据)。

谢谢 -维杰

【问题讨论】:

  • Afaik 当您删除 comment 并对其回复和投票具有级联关系时,它也应该删除这些。您是否对您的 cmets 有回复和投票的级联关系?请向我们展示相关的迁移。

标签: laravel foreach


【解决方案1】:

我建议为此使用观察者。

https://laravel.com/docs/5.8/eloquent#observers

public function deleted(Review $review)
{
    foreach($review->replies as $reply){
    $votes = $reply->votes;
    Votes::destroy($votes)
}

Destroy 方法允许您删除多个模型。 在这种情况下,对于任何下一个级别,您都必须使用另一个 foreach 循环。

$reply = $reply->votes();不起作用,因为您应该使用

$votes = $reply->votes;
//or
$votes = $reply->votes()->get();

【讨论】:

    【解决方案2】:
    // Review Model
    public function deleteRelatedData() {
    
      // Delete all votes of this review
      $this->votes()->delete();
    
      // Calling the same method to all of the child of this review
      $this->replies->each->deleteRelatedData();
    }
    
    // Controller
    public function deletereview($id=null){
        $review = Review::find($id);
        $review->deleteRelatedData();
        return back();
    }
    

    【讨论】:

    • 感谢您的回答,但我通过将回复级别降低到 1 级解决了这个问题,这意味着只需要一个 foreach 循环。但在此之前,我采用了和你类似的方法,也解决了这个问题。
    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 2014-08-02
    • 2015-09-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多