我正在显示从 Algolia 获得的分页结果。我的 Controller 中有两个要分页的查询。这就是我将数据从 Controller 发送到 View 的方式:
public function index(Request $request)
{
if(!$request->q && !$request->page){
return redirect('/');
}
$videos = Video::search($request->q)->paginate(1);
$videosCollection = $videos->getCollection();
return fractal()
->collection($videosCollection)
->parseIncludes(['player'])
->transformWith(new VideoTransformer)
->paginateWith(new IlluminatePaginatorAdapter($videos))
->toArray();
}
那么当我搜索例如
'rene'
时结果显示在 url http://videoapp.app/search?q=rene
上我得到的数据是这样的:
{
data: [
{
id: 46,
description: null,
views: 0,
created_at: "1 month ago",
player: {
data: {
id: 34,
image: "15889ca47e557c12240142_1013305815416003_5199651181367705874_n.jpg",
first_name: "Bruno",
last_name: "Hendricks"
}
}
}
],
meta: {
pagination: {
total: 2,
count: 1,
per_page: 1,
current_page: 1,
total_pages: 2,
links: {
next: "http://videoapp.app/search?query=rene&page=2"
}
}
}
}
但是为下一页创建的分页链接是
"http://videoapp.app/search?query=rene&page=2"
如果我点击它,元数据就会改变,我会得到整个表的结果,而不仅仅是我的第一个查询的结果 'rene'
在这个例子中。另一方面,如果我在浏览器中输入网址 http://videoapp.app/search?q=rene&page=2
然后它就像它应该的那样工作。我如何更改这些生成的链接以使其正常工作?
我也尝试过另一个来自 SO 的例子,这对我来说又不起作用:
Controller :
if(!$request->q && !$request->page){
return redirect('/');
}
$players = Player::search($request->q)
->paginate(1);
$videos = Video::search($request->q)
->paginate(1);
$videos->setPageName('videos');
查看
{{ $videos->appends(array_except(Request::only('q'), 'page'))->links() }}
和
{{ $players->appends(array_except(Request::only('q'), 'videos'))->links() }}
我也尝试了答案中的建议:
public function index(Request $request)
{
$q = $request->q;
$videosPage = $request->vpage;
$playersPage = $request->ppage;
if (! $request->q) {
return redirect('/');
}
$players = Player::search($q)
->paginate(1, 'ppage')
->appends(['q' => $q, 'vpage' => $videosPage]);
$videos = Video::search($q)
->paginate(1, 'vpage')
->appends(['q' => $q, 'ppage' => $playersPage]);
return view('search.index', [
'players' => $players,
'videos' => $videos,
]);
}
但这也不起作用,例如,当我单击播放器的链接时,它会返回到视频结果。似乎无法找到解决此问题的任何方法?
最佳答案
问题是您需要 3 个单独的查询字符串值(“q”表示搜索词,以及每个分页器的页码),默认分页链接会清除它们,只留下与当前分页器对应的值。
我会试试这个:
public function index(Request $request)
{
$q = $request->q;
$videosPage = $request->vpage;
$playersPage = $request->ppage;
if (! $request->q) {
return redirect('/');
}
$players = Player::search($q)
->paginate(1, 'ppage')
->appends(['q' => $q, 'vpage' => $videosPage]);
$videos = Video::search($q)
->paginate(1, 'vpage')
->appends(['q' => $q, 'ppage' => $playersPage]);
return view('search.index', [
'players' => $players,
'videos' => $videos,
]);
}
这样,每个分页器都有自己的页面名称,并在查询字符串中保留另一个和搜索词。
关于Laravel 5.3 - 单个页面上的多个分页不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42331457/