Laravel 5.3 - 单页多重分页无法正常工作

13

我正在展示从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'。另一方面,如果我在浏览器中输入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,
    ]);
}

但是那也没有起作用,当我点击球员链接时,它会回到视频结果,例如。似乎找不到解决这个问题的方法?


这个问题已经在这里得到了回答:https://dev59.com/s2Af5IYBdhLWcg3w_Gyr - Dunsin Olubobokun
3个回答

4
问题在于你需要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
@Leff 嗯,点击分页器链接将使用新请求的响应刷新浏览器,因此“活动选项卡状态”将不会被保留。似乎最简单的方法是使用 AJAX 请求...实际上,你为什么不使用 Algolia JavaScript 客户端呢? - alepeino
1
我正在使用Algolia JavaScript客户端进行自动完成,不确定如何将其用于解决此问题。 - Leff

0

将窗口分为玩家或视频,使用<-- - Iframe -- - >或<--- frameset -->。在您的控制器中使用不同的方法,输出将显示在同一窗口中。


1
我不确定如何做到这一点,你能给一个代码示例吗? - Leff

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

这是导致你的问题的原因,当你点击分页链接时,它会将?q=something替换为?page=2,这会导致你的函数重定向。

使用其他东西,例如:

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

1
我的Player模型中没有任何搜索方法,我只是在模型中使用Laravel\Scout\Searchable - Leff
请使用paginate(1);而不是paginate(1, ['*'], 'videos'); - Marcus
1
它仍然没有按照预期工作,分页链接已经创建,没有错误,但我没有得到两个单独的查询,分页链接从视频结果继续到播放器结果,我希望在每个选项卡中有单独的结果和分页。对于播放器和视频,我都需要分别的结果和分页。 - Leff
现在这是一个不同的问题 ;) 这里有解决方案:https://dev59.com/s2Af5IYBdhLWcg3w_Gyr - Marcus
1
是的,这正是我一直想问的问题,我看到了那个问题的解决方案,但在我的情况下并没有帮助。 - Leff
应该能够与他的解决方案配合运作,记得在重定向函数中添加 other_page。 - Marcus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接