2017-02-19 59 views
13

我显示的是从Algolia获得的分页结果。我在我的控制器中有两个查询,我分页。这就是我从控制器将数据发送到视图:Laravel 5.3 - 单个页面上的多个分页不起作用

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,另一个例子再次没有为我工作:

控制器:

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() }} 

我也tr从答案IED中建议:

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, 
    ]); 
} 

但也没有工作,当我点击一个链接,供玩家会回到视频搜索结果的例子。似乎无法找到这个问题的任何解决方案?

+0

这个问题已经在这里回答https:// stackoverflow.com。com/questions/24086269/laravel-multiple-pagination-in-one-page –

回答

0
if (!$request->q) { 
    return redirect('/'); 
} 

这是造成您的问题,当你按下PAGINATE链接它将取代?Q =东西?页= 2,这将导致你的函数重定向。

使用别的例如:

if(!request->q && !request->page){ 
    return redirect('/'); 
} 
+1

我在Player模型中没有任何搜索方法,我只是在我的模型中使用'''Laravel \ Scout \ Searchable'''它。 – Leff

+0

并使用paginate(1);而不是分页(1,['*'],'videos'); –

+1

它仍然没有工作,因为它应该是,在创建分页链接,并没有错误,但我没有得到两个单独的查询,分页链接从视频中业绩不断运动员比赛成绩,我想有单独的结果和每个选项卡中的分页,供玩家和视频使用。 – Leff

0

鸿沟玩家或视频的窗口 与< - - I帧 - - >或< ---框架 - >使用不同的方法到控制器中输出将出现在同一个窗口中。

+1

我不知道该怎么做,你能举一些代码示例吗? – Leff

5

问题是您需要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, 
    ]); 
} 

这样,每个分页程序都有自己的页面名称,并保持其他一个和查询字符串搜索词。

+1

它似乎对视频正常工作,但当我切换到播放器选项卡并开始点击新页面时,它会返回到视频选项卡和视频结果。 – Leff

+0

@好的,点击paginator链接会刷新浏览器并显示新请求的响应,所以“活动标签状态”将不会被保留。似乎最简单的方法是AJAX请求,然后......实际上,为什么不使用Algolia JavaScript客户端呢? – alepeino

+1

我正在使用Algolia javascript客户端进行自动完成,不确定如何使用它来解决此问题。 – Leff

相关问题