laravel - Laravel 雄辩的急切加载`has-many`与提供多少加载的关系?
问题描述
我知道我可以使用该with
方法来渴望加载关系。但是如何确定“要加载多少”?
例如,一个Post
模型有很多Comment
,我想每个帖子只加载 5 条评论。因为一篇文章可能有数千条评论,我不想全部加载。我怎么能这样做?
如果我不能用 Laravel eloquent 做到这一点,那么对于这样的用例,原始 SQL 会是什么?
解决方案
两种方式。
- 使关系本身限制了结果。
public function comments()
{
return $this->hasMany(Comment::class)->limit(5);
}
- 急切加载时使用闭包来限制结果
Post::with(['comments' => function ($query) {
$query->limit(5);
})->get();
// or
Post::with(['comments' => fn($query) => $query->limit(5)])->get();
我认为第二种方法更好。
编辑
根据此评论,您可以限制结果,但语法不是很漂亮。
Post::with(['comments'])->get()
->map(function ($query) {
$query->setRelation('comments', $query->comments->take(5));
return $query;
});
// or
Post::with(['comments'])->get()
->map(fn($query) => tap($query)->setRelation('comments', $query->comments->take(5)));
毫无价值,这不会改变关系查询,所以如果 5 个帖子总共有 1000 条评论,它仍然会查询数据库中的所有 1000 条评论。
推荐阅读
- binary - 从 22 字节十六进制解码纬度和经度
- excel - 运行时错误“1004”:应用程序定义或对象定义错误 - 按日期过滤数据透视表对
- mysql - "join" 在这个位置无效,期待 EOF ,";"
- apache-spark - 如何对大型特征集进行主成分分析?
- python - NGROK 与 Python 和树莓派
- postfix-mta - 客户端主机被拒绝:找不到您的反向主机名
- web - 用于将用户发送到外部链接的网站队列按钮
- reactjs - 如何在 Antd-Calendar 中显示假期?
- python - 如何在 np.einsum 中执行此 np.tensordot 操作
- swift - 工具栏垫片在 3 面板设计中不起作用