Подтвердить что ты не робот

Laravel 5.3 - Многостраничная разбивка на одну страницу не работает

Я показываю paginated результаты, которые я получаю от 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,
    ]);
}

Но это также не сработало, когда я нажму ссылку на игроков, он вернется к видео-результатам, например. Кажется, не может найти решение этой проблемы?

4b9b3361

Ответ 1

Проблема состоит в том, что вам нужны 3 отдельных значения строки запроса ( "q" для поискового запроса и номер страницы для каждого paginator), а ссылки для разбивки по умолчанию очищают их, оставляя только те, которые соответствуют текущему языку.

Я бы попробовал это:

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 имеет собственное имя страницы, а другой - и поисковый запрос в строке запроса.

Ответ 2

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

Это вызовет вашу проблему, когда вы нажмете ссылку в paginate, она заменит? q = что-то на? page = 2, что приведет к перенаправлению вашей функции.

Используйте что-то еще ex:

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

Ответ 3

Разделите окно для игроков или видео с < - - Iframe - → or < --- frameset → Использовать другой метод в вашем контроллере, и вывод будет отображаться в том же окне.