Laravel 5.3 - 单个页面上的多个分页不起作用

标签 laravel pagination algolia

我正在显示从 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/

相关文章:

javascript - 在 Controller 的 div 中显示图像?

android - 仅获取一次随机数据的数据库查询

mysql - 分页 - 如果满足特定条件如何跳过记录

c# - 使用 NHibernate 对延迟加载的集合进行分页

reactjs - React Native Algolia 即时搜索和搜索框

php - PHP 和 Laravel 中的接口(interface)和存储库命名

laravel - 如何通过post方法从 postman 保存和下载原始数据中的视频文件等文件

pagination - 如何为 2 部分博客条目设置规范 URL?

ruby-on-rails - 阿尔戈利亚搜索索引中的字段等于字符串

javascript - 在同一项目上使用多个范围值进行搜索