存在关于旧的 L3 急切加载分页的问题,而不是使用 eloquent。但我想使用雄辩来获得与分页的热切加载关系。
主要型号:Topic与有一对多关系Posts,
所以那个Topic有很多Posts。我用这个函数获取所有数据:
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,
- 但是否有可能使用急切加载的关系posts那是分页的吗?怎样才能做到呢?
澄清一下:对热切加载的关系进行分页在某种程度上是一种误解。预先加载的目的是在尽可能少的查询中检索所有关系。如果您想检索 10 个主题,其中所有主题都有 35 个帖子,则只需要两个查询。甜的!
也就是说,对急切的关系进行分页是行不通的。考虑发生急切加载时的两种情况:
您想要检索并列出主题,并且可能列出每个主题的前五个帖子。伟大的!预加载是完美的。现在,您不想在这样的页面上对急切加载的帖子进行分页,所以这并不重要。
您加载一个主题,并且想要对该主题的帖子进行分页。伟大的!比较容易做到。但是,如果您已经急切加载all属于该主题的帖子,您可能只是检索到了许多您不需要的额外资源。因此急切加载实际上是hurting you.
那就是说,有两种可能的解决方案:
选项 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);
}
优点:使用急切加载关系;不创建额外的查询。
缺点:无论当前页面如何,都必须检索所有元素(慢);必须手动构建当前页面元素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)