有关旧的L3渴望加载的分页的问题,而不是使用雄辩的。但是我想利用雄辩来获得与分页的热切关系。
主要模式:与帖子有一对多关系的主题, 因此,主题有很多帖子。我使用此函数获取所有数据:
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()并且会得到分页$ pot,
答案 0 :(得分:32)
澄清一些事情:分页急切加载的关系有点误解。渴望加载的重点是尽可能少地查询所有关系。如果要检索10个主题,所有主题都有35个帖子,则只需要两个查询。甜!
也就是说,分散一个急切的关系并不会起作用。当出现急切加载时,请考虑两种情况:
您想要检索和列出主题,并列出每个主题的前五个帖子。大!渴望装载是完美的。现在,您不希望在这样的页面上对热切的帖子进行分页,所以没关系。
您加载了一个主题,并且想要为该主题分页。大!比较容易做到。但是,如果您已经热切地加载了属于此主题的所有帖子,那么您很可能会检索到许多您不需要的额外资源。因此,急切加载实际上伤害你。
那说,有两种可能的解决方案:
选项1:创建一个自定义访问器,用于对Eloquent关系进行分页。
/**
* Paginated posts accessor. Access via $topic->posts_paginated
*
* @return \Illuminate\Pagination\Paginator
*/
public function getPostsPaginatedAttribute()
{
return $this->posts()->paginate(10);
}
优点:很容易分页;不干扰正常职位关系 缺点:急切加载帖子不会影响此访问者;运行它将在急切加载的查询之上创建两个额外的查询。
选项2:分散由热切关系关系返回的帖子集合。
/**
* 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);
}
优点:使用急切的关系;不会产生任何其他疑问 缺点:无论当前页面如何,都必须检索所有元素(慢);必须手动构建当前页面元素。
答案 1 :(得分:4)
您可能需要查看以下内容:
$category = 'Laravel';
$posts = Post::with('user', 'category')->whereHas('category', function($query) use ($category) {
$query->where('name', '=', $category);
})->paginate();
作者:Zenry: 来源:http://laravel.io/forum/02-25-2014-eager-loading-with-constrains-load-post-based-on-category-name
希望这有帮助