限制嵌套查询中的结果数

时间:2016-09-23 01:29:09

标签: laravel laravel-5 eloquent laravel-5.3

我有一个名为comments的表,其中包含以下列:

| id | user_id | post_id | parent_id | text |

我有一个嵌套评论系统的设置,例如Disqus:

enter image description here

如果评论没有父评论,parent_id将为0.但如果评论 是父母,则parent_id将是id家长评论。

在我的Comments.php模型中,我有这种关系:

public function children()
{
    return $this->hasMany('App\Comment', 'parent_id', 'id')->with('children');
}

现在,如果我查询评论:

$comments = Comment::where('post_id', 1)
    ->where('parent_id', 0)
    ->with('children')
    ->get();

输出看起来像这样:

[
    {
        "id": 5,
        "user_id": "2",
        "post_id": "1",
        "parent_id": "0",
        "text": "Text",
        "children": [
            {
                "id": 7,
                "user_id": "1",
                "post_id": "1",
                "parent_id": "5",
                "text": "Text",
                "children": [
                    {
                        "id": 8,
                        "user_id": "3",
                        "post_id": "1",
                        "parent_id": "7",
                        "text": "Text",
                        "children": [

                        ]
                    },
                    {
                        "id": 11,
                        "user_id": "3",
                        "post_id": "1",
                        "parent_id": "7",
                        "text": "Text",
                        "children": [

                        ]
                    },
                ]
            },
            {
                "id": 9,
                "user_id": "1",
                "post_id": "1",
                "parent_id": "5",
                "text": "Text",
                "children": [

                ]
            }
            ,
            {
                "id": 10,
                "user_id": "1",
                "post_id": "1",
                "parent_id": "5",
                "text": "Text",
                "children": [

                ]
            }
        ]
    },
    {
        "id": 6,
        "user_id": "3",
        "post_id": "1",
        "parent_id": "0",
        "text": "Text",
        "children": [

        ]
    }
]

或者,简单来说:

- 5
-- 7
--- 8
--- 11
-- 9
-- 10
- 6

我想要做的是限制每个深度返回的结果数量。

因此,例如,如何更改我的查询/代码,使其返回:

  • 十个顶级结果(parent_id为0)
  • 两级1结果
  • 一个二级结果

所以最后,查询应该输出如下的注释:

- 5
-- 7
--- 8
-- 9
- 6

如您所见,有两个顶级结果(最多允许10个),两个一级结果和一个二级结果。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

而不是在模型中使用with而不是无法控制的数据检索,为什么不在需要时呢?

这意味着,在Comment.php中删除with

public function children()
{
    return $this->hasMany('App\Comment', 'parent_id', 'id');
}

在你的控制器/助手/服务类中,只检索你需要的东西?例如:

$comments = Comment::where('post_id', 1)
    ->where('parent_id', 0)
    ->with('children' => function($query) {
        $query->with('children' => function($query) {
            $query->with('children')
                  ->orderBy('created_at', 'desc')
                  ->take(1); //last 1
        })
        ->orderBy('created_at', 'desc')
        ->take(2); // intermediate 2
    })
    ->orderBy('created_at', 'desc')
    ->take(10) //the outermost 10
    ->get();

尚未测试,但理论上应该有效:)

注意:created_at添加了订单,因为我们通常希望最新的几条评论出现在顶部:)