Laravel 5.3 - 单个页面上的多个分页无效

时间:2017-02-19 18:58:09

标签: laravel pagination algolia

我正在显示我从Algolia获得的分页结果。我在我的控制器中有两个查询,我分页。这是我将数据从控制器发送到视图的方式:

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'的示例时,结果会显示在网址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() }}

我也尝试过答案的建议:

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 个答案:

答案 0 :(得分: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,
    ]);
}

这样,每个paginator都有自己的页面名称,并将另一个和搜索词保留在查询字符串中。

答案 1 :(得分:0)

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

这会导致您的问题,当您按下它将替换的分页链接?q =某些内容?page = 2会导致您的功能重定向。

使用其他东西ex:

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

答案 2 :(得分:0)

划分玩家或视频的窗口 与< - - iframe - - >或< --- frameset - >在控制器中使用不同的方法,输出将出现在同一窗口中。