请问下 with 怎么限定条数?

有两个表
文章表 Article
评论表 Comment
他们是一对多的关系,
现在我想每页读取10篇文章,每篇文章只取最新的三条评论,请问这种要怎么实现
我尝试过

Article::with(['comment'=>function($query){
    $query->limit(3)
}])->limit(10)->get();

这种不行,这种的话最终得到的结果是3篇文章,请问下要怎么写才能读10篇文章,每篇文章只取三条最新的记录呢?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 11
jltxwesley

@linzi @Echoiii
你上面的方法会导致 N+1 的问题,比如你取 100个 Doctor,会运行 101 条 Query。

可以试下重新设置关系:

$articles = Article::with(['comments'])->take(10)->get()->map(function ($item) {
    $item->setRelation('comments', $item->comments->take(3));
    return $item;
});
5年前 评论

@linzi 你Doctor的limit(1)的时候是可以的 大于1的时候除了第一条limit(3)是有效,其他的都为空了

5年前 评论

用foreach处理一下啊

5年前 评论
jltxwesley

@linzi @Echoiii
你上面的方法会导致 N+1 的问题,比如你取 100个 Doctor,会运行 101 条 Query。

可以试下重新设置关系:

$articles = Article::with(['comments'])->take(10)->get()->map(function ($item) {
    $item->setRelation('comments', $item->comments->take(3));
    return $item;
});
5年前 评论

@jltxwesley 你这样可以加 限制条数 但是with 方法 里面 怎么加 count 或者groupBy啊

5年前 评论

@jltxwesley
第一种打印出来的结果
array:5 [▼
0 => array:5 [▼
"id" => 1
"name" => "文章1"
"created_at" => "2018-11-09 13:51:25"
"updated_at" => "2018-11-09 13:51:28"
"limit_comment" => array:3 [▶]
]
1 => array:5 [▼
"id" => 2
"name" => "文章2"
"created_at" => "2018-11-09 13:51:37"
"updated_at" => "2018-11-09 13:51:49"
"limit_comment" => []
]
2 => array:5 [▼
"id" => 3
"name" => "文章3"
"created_at" => "2018-11-09 13:51:58"
"updated_at" => "2018-11-09 13:52:01"
"limit_comment" => []
]
3 => array:5 [▼
"id" => 4
"name" => "文章4"
"created_at" => "2018-11-09 13:52:09"
"updated_at" => "2018-11-09 13:52:12"
"limit_comment" => []
]
4 => array:5 [▼
"id" => 5
"name" => "文章5"
"created_at" => "2018-11-09 13:52:21"
"updated_at" => "2018-11-09 13:52:23"
"limit_comment" => []
]
]
只有第一条数据限制到了,
第二种方法我试过,他是将集合里面的数据全部查出来再对集合进行重新筛选的,如果评论数据量大的话 这样会很慢的

5年前 评论
jltxwesley

@Echoiii

不好意思 最近有事 没上社区。

对 第一种方法没有解决问题 第二种的话 articles 如果已经有分页了,取出三个评论去重制关系,速度应该还好,不过会用到更多的内存。你可以写个 seeder,用 factory 加载上万条的评论去测试下。

5年前 评论
jltxwesley

@Echoiii

忘记说了,至于第一种为什么不行,其实犯的错误和你问的是一样的,第一次回你的时候没注意:
因为 Laravel 只用一条语句 预加载关系,当我们在关系中加入 take/limit 3 的时候,会导致该语句只返回三条 comments,所以得到的结果就是第一篇 article 中有 comments,其余的都没有

select * from "comments" where "comments"."article_id" in (1,2,3,4,5,6,7,8,9,10) limit 3
5年前 评论

laravel with 查询列表限制条数可以参考这个https://blog.csdn.net/xlmmsby/article/deta...

不能使用with去查询,with底层是in查询,in查询后边跟limit没用的

5年前 评论
hezhizheng 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!