我在一个页面上有两个集合,它们应该都是分页的。但是分页为两个(?page = X)生成相同的参数。
我该如何解决这类问题?
答案 0 :(得分:1)
您可以通过
更改任一分页的参数 Paginator::setPageName('someparam');
详细了解分页here在Customizing 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)
假设您有User
和Post
型号。然后,您可以在控制器中执行以下操作:
$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()
。一切都应该正常工作。