如何使用Laravel在一个页面上对两个Eloquent集合进行分页?

时间:2015-11-12 05:30:13

标签: laravel laravel-5 eloquent

我在一个页面上有两个集合,它们应该都是分页的。但是分页为两个(?page = X)生成相同的参数。

我该如何解决这类问题?

2 个答案:

答案 0 :(得分:1)

您可以通过

更改任一分页的参数

Paginator::setPageName('someparam');

详细了解分页hereCustomizing The Paginator URI

部分

注意:您应该在完成paginator之前执行此操作,即

$yourCollection = Model::paginate(10);

示例:

我假设你有两个这样的分页

Paginator::setPageName('yourFirstParam');
$firstCollection = FirstModel::paginate(10);

Paginator::setPageName('yourSecondParam');
$secondCollection = SecondModel::paginate(10);

你用它来进入你的观点

Paginator::setPageName('yourFirstParam');
$firstCollection->links();
Paginator::setPageName('yourSecondParam');
$secondCollection->links();

答案 1 :(得分:1)

有一种方法可以自动地#34;设置页面名称(在某种意义上),我稍后会介绍。

首先,如果我们查看paginate method,您会看到它接受pageName参数作为其第三个参数:

public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)

假设您有UserPost型号。然后,您可以在控制器中执行以下操作:

$users = User::paginate(10, ['*'], 'users');
$posts = Post::paginate(10, ['*'], 'posts');
return view('example', compact('users', 'posts'));

除了第二个参数指定要选择的列,第三个参数指定页面名称外,它的工作方式与普通分页相似。

在您看来,当您渲染分页链接时,执行此操作时可能会遇到问题:

{!! $users->render() !!}
{!! $posts->render() !!}

虽然将呈现分页链接,但当您单击指向帖子页面的链接时,用户查询字符串参数将消失。因此,用户返回第一页,反之亦然。

要解决此问题,您可以使用appends method保留两个模型的查询参数:

{!! $users->appends(['posts' => Request::query('posts')])->render() !!}
{!! $posts->appends(['users' => Request::query('users')])->render() !!}

这一切都有效,但它有点难看,所以我们如何清理它呢?您可以创建自己的方法来自动化"这个流程。在您的模型中,您可以添加自己的分页方法:

// Name it whatever you want, but I called it superPaginate lol
protected function superPaginate($perPage)
{
    return $this->newQuery()->paginate(10, ['*'], $this->getTable());
}

这会自动将分页名称设置为模型的表名。因此对于User模型,页面名称将是" users"。对于Post模型,页面名称将为" posts"。

渲染链接仍然存在问题。您不想一直致电appends并指定查询参数。要解决此问题,我们可以将superPaginate方法改进为:

protected function superPaginate($perPage, $columns = ['*'], $page = null)
{
    $params = \Request::query();
    return $this->newQuery()->paginate(10, $columns, $this->getTable(), $page)->appends($params);
}

现在,您需要做的就是Model::superPaginate(10);$models->render()。一切都应该正常工作。