在约束预加载时,不能使用 limit 和 take 查询构造器方法 ?

Laravel 版本: 6.x

在约束预加载时,不能使用 limit 和 take 查询构造器方法 ?

我想在 帖子列表 中关联查询出 最新的一条评论

App\Post::with(['comments' => function ($q) {
    $q->orderBy('created_at', 'desc)->limit(1);
}])->paginate();

结果就是没有查询出来

App\Post::with(['comments' => function ($q) {
    $q->orderBy('created_at', 'desc);
}])->paginate();

这样不加入 limit 又是可以查询出来

最后想请教各位, 有没有其他的办法能够 优雅 的在 帖子列表 关联查询出 最新的一条评论 ?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
__yu
最佳答案

单独定义一个 hasOne,这样优雅不?

public function latestComment()
{
    return $this->hasOne(Comment::class)->latest(); 
}
3年前 评论
__yu (作者) 3年前
JerryBool 3年前
讨论数量: 10

first() 可以试试,我不确定是否可以解决你的问题

3年前 评论

@daijunooo 好像不行, 我试了. first 的原理好像就是用的 take(1)

3年前 评论

在定义关联关系的时候使用 limit 就可以了

public function latestComment()
{
    return $this->hasMany(Comment::class, 'post_id', 'id')->latest()->limit(1);
}
3年前 评论
lddtime 3年前
zxdstyle (作者) 3年前

刚刚我看了一下打印出来的 SQL日志

select * from `posts` limit 15 offset 0;
select * from `comments` where `comments`.`post_id` in (1, 6, 8, 9, 16, 20, 28, 31, 34, 37, 38, 44, 49, 50, 51) order by created_at desc limit 1;

我觉得我的这个想法本身就是有问题, 第二条 sql 语句 是查询所有的评论然后 limit(1), 并不是我所想的取每个 postcomments 第一条

3年前 评论

@qf-Z whereHas 查询 会不会把 没有评论 的帖子过滤掉

3年前 评论

@panliang 是哈,想当然了:sweat_smile:

3年前 评论

理解 N+1 这两条 sql,你就知道为啥了 :laughing::laughing:

file

3年前 评论
__yu

单独定义一个 hasOne,这样优雅不?

public function latestComment()
{
    return $this->hasOne(Comment::class)->latest(); 
}
3年前 评论
__yu (作者) 3年前
JerryBool 3年前

听说 postgresql 可以优雅的处理这种查询,,,

3年前 评论

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