Laravel 5.3 - Множественная разбивка на страницы на одной странице не работает

Я показываю результаты с разбивкой на страницы, полученные от 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,
    ]);
}

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


person Leff    schedule 19.02.2017    source источник
comment
На этот вопрос был дан ответ здесь stackoverflow.com/ questions / 24086269 /   -  person Dunsin Olubobokun    schedule 17.12.2017


Ответы (3)


Проблема в том, что вам нужно 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,
    ]);
}

Таким образом, каждый пагинатор имеет собственное имя страницы и сохраняет другое имя и условие поиска в строке запроса.

person alepeino    schedule 23.02.2017
comment
Кажется, это нормально работает для видео, но когда я переключаюсь на вкладку проигрывателя и начинаю нажимать на новые страницы, он возвращается на вкладку видео и результаты видео. - person Leff; 23.02.2017
comment
@Leff хорошо, нажатие на ссылку пагинатора обновит браузер с ответом на новый запрос, поэтому активное состояние вкладки не будет сохранено. Тогда кажется, что самым простым способом были бы запросы AJAX ... На самом деле, почему бы вам не использовать вместо этого javascript-клиент Algolia? - person alepeino; 23.02.2017
comment
Я использую javascript-клиент Algolia для автозаполнения, не знаю, как мне его использовать для этой проблемы. - person Leff; 23.02.2017

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

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

Используйте что-нибудь еще, например:

if(!request->q && !request->page){
    return redirect('/');
}
person Marcus    schedule 22.02.2017
comment
У меня нет метода поиска в модели Player, я просто использую Laravel\Scout\Searchable в своей модели для него. - person Leff; 23.02.2017
comment
и используйте paginate (1); а не paginate (1, ['*'], 'videos'); - person Marcus; 23.02.2017
comment
Он по-прежнему не работает должным образом, ссылки для разбивки на страницы созданы, и ошибок нет, но я не получаю двух отдельных запросов, ссылки разбивки на страницы переходят от результатов видео к результатам проигрывателя, и я хотел бы получить отдельные результаты и нумерация страниц на каждой вкладке для плееров и видео. - person Leff; 23.02.2017
comment
Теперь это другая проблема;) решение здесь: stackoverflow.com/questions/24086269/ - person Marcus; 23.02.2017
comment
Да, и это был мой вопрос все время, я видел решения этого вопроса, но в моем случае это не помогло. - person Leff; 23.02.2017
comment
Если он работает с его решением, не забудьте добавить other_page в функцию перенаправления. - person Marcus; 23.02.2017

Разделите окно для игроков или для видео с помощью ‹- - Iframe - -> или‹ --- frameset -> Используйте другой метод в вашем контроллере, и результат появится в том же окне.

person Heartbeat    schedule 23.02.2017
comment
Я не уверен, как это сделать, не могли бы вы привести пример кода? - person Leff; 24.02.2017