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

dphi5xsq  于 2023-01-27  发布在  其他
关注(0)|答案(4)|浏览(273)

我正在显示从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中输入url,那么它就应该工作了。我怎样才能改变这些生成的链接,使它的工作,因为它应该是?
我还尝试了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,
    ]);
}

但这也不起作用,当我点击一个链接的球员,它会回到视频结果,例如。似乎不能找到任何解决这个问题?

0wi1tuuw

0wi1tuuw1#

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

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

p1iqtdky

p1iqtdky2#

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

这就是你的问题所在,当你点击分页链接时,它会将?q=something替换为?page=2,这将导致你的函数重定向。
使用其他内容,例如:

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

nafvub8i3#

使用〈-- - Iframe -- -〉或〈--- frameset --〉将播放器或视频窗口分开使用不同的方法到您的控制器中,输出将出现在同一窗口中。

42fyovps

42fyovps4#

use:

$datas= Data::simplePaginate(10, ['*'], 'page_items');

当前页面应该存储在一个名为page_items的查询字符串参数中。创建分页链接时,您可以将自定义查询字符串参数作为第二个参数传递给links方法。

{{ $items->appends(['page' => 'page_items'])->links() }}

你必须使用一个包"laravel-simple-pagination"
您需要使用nextPageUrl和previousPageUrl属性而不是nextPage和previousPage来生成下一个和上一个链接。

相关问题