首页 > 解决方案 > Laravel 雄辩的急切加载`has-many`与提供多少加载的关系?

问题描述

我知道我可以使用该with方法来渴望加载关系。但是如何确定“要加载多少”?

例如,一个Post模型有很多Comment,我想每个帖子只加载 5 条评论。因为一篇文章可能有数千条评论,我不想全部加载。我怎么能这样做?

如果我不能用 Laravel eloquent 做到这一点,那么对于这样的用例,原始 SQL 会是什么?

标签: laraveleloquent

解决方案


两种方式。

  1. 使关系本身限制了结果。
public function comments()
{
    return $this->hasMany(Comment::class)->limit(5);
}
  1. 急切加载时使用闭包来限制结果
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 条评论。


推荐阅读