使用Laravel Commentable / Nested Set的递归子项

时间:2018-01-11 15:44:12

标签: php laravel

我正在尝试使用Laravel Commentable获取所有递归子项。截至目前,我可以得到这样的第一个孩子:

$user->comments()->with(['creator', 'children.creator'])->where('parent_id', null)->get()

但这不是“递归”而且我必须一遍又一遍地做:children.children.children等。我如何得到所有评论及其各自的孩子,以便我可以将其作为JSON返回?

示例输出:

{
  "comments": [
    {
      "id": 1,
      "body": "foo",
      "children:" 
        {
          "id": 5,
          "body": "foo",
          "children:"
            {
              "id": 5,
              "body": "foo",
              // etc
            }
        }         
    }
}

2 个答案:

答案 0 :(得分:0)

我会尝试一种递归方法,因为你不确定评论会有多少个孩子。只需添加一个不同的方法:

public function commentRecourse($model, $child = null){
    if(isset($model->child->id)){
        return $child . '.child';
    }else{
        return false;
    }
}

这将返回一个新的关系字符串,例如' children.children.children'孩子有关系的任何时候。您可以在此函数返回false时停止的循环中调用此方法。像:

loop stuff(){
  $variable[] = commentRecourse($model, $child)
}

然后将变量作为with()参数传递。

$user->comments()->with($variable)->where.... etc.

抱歉,忘了添加json_encoding()数组输出将显示关系,除非你搞砸了$ hidden模型属性。

答案 1 :(得分:0)

我最终检索了所有评论$user->comments,然后按照这样排序/排列:

public static function arrange($comments)
{
    $comments->transform(function ($comment) use ($comments) {
        $comment->children = $comments->where('parent_id', $comment->id);
        return $comment;
    });

   return $comments->reject(function ($comment) {
        return $comment->parent_id !== null;
    });
}