我有一个名为comments
的表,其中包含以下列:
| id | user_id | post_id | parent_id | text |
我有一个嵌套评论系统的设置,例如Disqus:
如果评论没有父评论,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)所以最后,查询应该输出如下的注释:
- 5
-- 7
--- 8
-- 9
- 6
如您所见,有两个顶级结果(最多允许10个),两个一级结果和一个二级结果。
我该怎么做?
答案 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
添加了订单,因为我们通常希望最新的几条评论出现在顶部:)