【问题标题】:Laravel 5.3 - Multiple pagination on a single page not workingLaravel 5.3 - 单个页面上的多个分页不起作用
【发布时间】:2017-07-08 23:00:39
【问题描述】:

我正在显示从 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' 时,结果显示在 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' 在这个例子中。另一方面,如果我在浏览器中输入 url 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,
    ]);
}

但这也不起作用,例如,当我单击播放器链接时,它会返回到视频结果。似乎找不到任何解决此问题的方法?

【问题讨论】:

标签: laravel pagination algolia


【解决方案1】:

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

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

【讨论】:

  • 它似乎适用于视频,但是当我切换到播放器选项卡并开始点击新页面时,它会返回视频选项卡和视频结果。
  • @Leff 好吧,点击分页器链接将用新请求的响应刷新浏览器,因此不会保留“活动选项卡状态”。看起来最简单的方法是 AJAX 请求……事实上,你为什么不使用 Algolia javascript 客户端呢?
  • 我正在使用 Algolia javascript 客户端进行自动完成,不知道如何使用它来解决这个问题。
【解决方案2】:

为播放器或视频划分窗口 使用 或 在控制器中使用不同的方法,输出将出现在同一窗口中。

【讨论】:

  • 我不知道该怎么做,你能给一些代码示例吗?
【解决方案3】:
if (!$request->q) {
    return redirect('/');
}

这导致了您的问题,当您按下分页链接时,它会将 ?q=something 替换为 ?page=2 ,这将导致您的函数重定向。

使用其他东西例如:

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

【讨论】:

  • 我在播放器模型中没有任何搜索方法,我只是在我的模型中使用Laravel\Scout\Searchable
  • 并使用 paginate(1);而不是分页(1, ['*'], 'videos');
  • 它仍然无法正常工作,分页链接已创建,并且没有错误,但我没有得到两个单独的查询,分页链接从视频结果继续到播放器结果,我想在每个选项卡中为播放器和视频提供单独的结果和分页。
  • 现在这是一个不同的问题 ;) 解决方案:stackoverflow.com/questions/24086269/…
  • 是的,这一直是我的问题,我看到了该问题的解决方案,但对我的情况没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多