在 laravel 中分页急切加载

Posted

技术标签:

【中文标题】在 laravel 中分页急切加载【英文标题】:Paginating eager loading in laravel 【发布时间】:2021-09-29 03:24:27 【问题描述】:

我正在尝试通过类别获取产品并在类别下显示产品。我还需要为每个类别的产品添加分页。我尝试了以下解决方案,并且获得了所有类别,但我仅获得一个类别的产品,而其他产品则为空。

    $this->category->with(['products' => function ($query) 
        $query->paginate(3);
    ])->get();

【问题讨论】:

你不能对关系进行分页......这没有任何意义,因为这里的“主要”模型是category,你如何对关系进行分页? @matiaslauriti 我该怎么做? .我必须逐个获取类别吗? 你不能对相关模型进行分页,你只能对主模型进行分页,所以,如果你只想得到X个products,你将不得不使用limit作为答案下来在下面,但这是你能做的,你不能对相关模型进行分页。 【参考方案1】:

我相信您想要的是对类别进行分页,但只对包含产品的类别进行分页。阅读whereHas (https://laravel.com/docs/8.x/eloquent-relationships#querying-relationship-existence)。

示例代码:

$this->category->with([
    'products' => function ($query) 
        $query->limit(3);
    
])
->whereHas('products')
->paginate(10);

如果您不想限制 3 个产品,则只需从 with 数组中删除闭包即可。 如果您知道您不会有太多类别,则可以完全删除分页(因此检索数据库中的所有类别,但只检索那些包含产品的类别)。

【讨论】:

以上是关于在 laravel 中分页急切加载的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel 将两个模型合并到一个分页查询中,并带有急切加载的关系

Laravel 动态关系 - 在急切加载时访问模型属性

如何在 laravel 中检索用户时急切加载?

Laravel 在急切加载时使用 Eloquent 选择特定列

Laravel Eloquent 中的急切加载

Laravel 5.1通过急切加载返回连接字段