gpt4 book ai didi

php - 拉拉维尔 4.1 : How to paginate eloquent eager relationship?

转载 作者:行者123 更新时间:2023-12-02 11:39:18 25 4
gpt4 key购买 nike

存在关于旧的 L3 急切加载分页的问题,而不是使用 eloquent。但我想使用 eloquent 来获得与分页的急切加载关系。

主模型:与帖子具有一对多关系的主题,这样一个主题就有许多帖子。我用这个函数获取所有数据:

public function findById($id)
{
return $this->topic->with('posts', 'posts.user', 'posts.user.profile')
->find($id);
}

后来我循环显示所有结果,但它们没有分页:

@foreach($topic->posts as $post)
... unpaginated content ...
@endforeach

所以,我可以做一个解决方法,分别选择所有具有 $id 主题的帖子,并使用 ->paginate() 而不是 ->get() ,并且会分页 $pots,

  1. 但是是否有可能使用分页的急切加载关系帖子?如何做到这一点?

最佳答案

澄清一下:对急切加载的关系进行分页在某种程度上是一种误解。预先加载的目的是在尽可能少的查询中检索所有关系。如果您想检索 10 个主题,其中所有主题都有 35 个帖子,则只需要两个查询。甜甜的!

也就是说,对急切加载的关系进行分页是行不通的。考虑发生急切加载时的两种情况:

  1. 您想要检索并列出主题,并且可能列出每个主题的前五个帖子。伟大的!预加载是完美的。现在,您不想在这样的页面上对急切加载的帖子进行分页,所以这并不重要。

  2. 您加载一个主题,并且想要对该主题的帖子进行分页。伟大的!比较容易做到。但是,如果您已经急切加载了属于该主题的所有帖子,那么您可能会检索到许多不需要的额外资源。因此,急切加载实际上伤害你。

也就是说,有两种可能的解决方案:

选项 1:创建一个对 Eloquent 关系进行分页的自定义访问器。

/**
* Paginated posts accessor. Access via $topic->posts_paginated
*
* @return \Illuminate\Pagination\Paginator
*/
public function getPostsPaginatedAttribute()
{
return $this->posts()->paginate(10);
}

优点:分页非常容易;不影响正常的帖子关系。
缺点:急切加载帖子不会影响此访问器;运行它将在急切加载的查询之上创建两个额外的查询。

选项 2:对急切加载关系返回的 posts 集合进行分页。

/**
* Paginated posts accessor. Access via $topic->posts_paginated
*
* @return \Illuminate\Pagination\Paginator
*/
public function getPostsPaginatedAttribute()
{
$posts = $this->posts;

// Note that you will need to slice the correct array elements yourself.
// The paginator class will not do that for you.

return \Paginator::make($posts, $posts->count(), 10);
}

优点:使用急切加载关系;不创建额外的查询。
缺点:无论当前页面如何,都必须检索所有元素(慢);必须手动构建当前页面元素。

关于php - 拉拉维尔 4.1 : How to paginate eloquent eager relationship?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20913606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com