我正在尝试使用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
}
}
}
}
答案 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;
});
}