【问题标题】:Laravel eloquent eager loading `has-many` relationship with providing how many to load?Laravel 雄辩的急切加载`has-many` 与提供多少加载的关系?
【发布时间】:2021-02-10 23:12:24
【问题描述】:

我知道我可以使用with 方法来预先加载关系。但是如何确定“加载多少”呢?

例如,Post 模型有许多 Comment,我只想加载 5 个 cmets每个帖子。因为一个帖子可能有数千个 cmets,所以我不想全部加载。我怎么能这样做?

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

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    两种方式。

    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();
    

    我认为第二种方法更好。

    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。

    【讨论】:

    • 谢谢,但是您的解决方案不起作用,因为您将 cmets 的总数限制为 5 个,我想要实现的是每个帖子获得 5 个 cmets。
    • 我已经编辑了我的答案以添加我在 github 上找到的解决方法。
    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2018-02-03
    • 2015-09-17
    • 2014-07-20
    相关资源
    最近更新 更多