【发布时间】:2021-02-10 23:12:24
【问题描述】:
我知道我可以使用with 方法来预先加载关系。但是如何确定“加载多少”呢?
例如,Post 模型有许多 Comment,我只想加载 5 个 cmets每个帖子。因为一个帖子可能有数千个 cmets,所以我不想全部加载。我怎么能这样做?
如果我不能用 Laravel eloquent 做到这一点,那么对于这样的用例,原始 SQL 会是什么?
【问题讨论】:
我知道我可以使用with 方法来预先加载关系。但是如何确定“加载多少”呢?
例如,Post 模型有许多 Comment,我只想加载 5 个 cmets每个帖子。因为一个帖子可能有数千个 cmets,所以我不想全部加载。我怎么能这样做?
如果我不能用 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();
我认为第二种方法更好。
Eloquent Relationships - Constraining Eager Loads
编辑
根据this comment,你可以限制结果,但语法不是很漂亮。
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 个 cmets,它仍然会查询数据库中的所有 1000 个 cmets。
【讨论】: