Laravel 5 Разбиение на страницы в неправильном месте

В настоящее время я обновляю один из моих проектов до Laravel 5 с 4.2. Я знаю, что многое изменилось с классом paginator, но я действительно не могу понять, почему это не работает. Я вызываю paginate () для красноречивых моделей в нескольких местах в моем проекте, и все работает отлично.

Но в этом же проекте есть страница поиска профиля с фильтрами, поэтому мне нужно вызвать огромный пользовательский запрос DB :: table (). После этого я хочу построить объект paginator из результатов.

$q = \DB:: HUGE QUERY HERE....

// Execute query
$results = $q->get();

// Get pagination information and slice the results.
$perPage = 20;
$total = count($results);
$start = (Paginator::resolveCurrentPage() - 1) * $perPage;
$sliced = array_slice($results, $start, $perPage);

// Eager load the relation.
$collection = Profile::hydrate($sliced);
$collection->load(['sports', 'info', 'profileImage']);

// Create a paginator instance.
$profiles = new Paginator($collection->all(), $total, $perPage);

return $profiles;

Моя проблема что ссылки, которые генерируются после звонка $profiles->render() ссылка на корень моего проекта вместо текущей страницы.

Пример:
Ссылки расположены по адресу mysite.com/profiles но ссылка на mysite.com/?page=2 вместо mysite.com/profiles?page=2

Мой код отлично работал в Laravel 4.2, иль ссылку на него ниже для справки:

Laravel 4.2 код, который работает:

$q = \DB:: HUGE QUERY HERE....

// Execute query
$results = $q->get();

// Get pagination information and slice the results.
$perPage = 20;
$total = count($results);
$start = (Paginator::getCurrentPage() - 1) * $perPage;
$sliced = array_slice($results, $start, $perPage);

// Eager load the relation.
$collection = Profile::hydrate($sliced);
$collection->load(['sports', 'info', 'profileImage']);

// Create a paginator instance.
$profiles = Paginator::make($collection->all(), $total, $perPage);

return $profiles;

Любая помощь приветствуется.
Спасибо!

3

Решение

Я наконец исправил это после нескольких часов работы!

Я узнал, что вы можете пройти путь к пагинатору.
Как вы можете видеть, это можно сделать, передав массив в качестве 5-го аргумента при построении объекта paginator. Этот массив будет перезаписывать любые параметры, которые вы передаете. Нам нужно переписать path вариант. Я получаю текущий путь, используя Paginator::resolveCurrentPath(),

Теперь мой код выглядит так:

// Create a paginator instance.
$profiles = new Paginator($collection->all(), $total, $perPage, Paginator::resolveCurrentPage(), [
'path' => Paginator::resolveCurrentPath()
]);

Для интересующихся конструктор paginator выглядит так:

__construct($items, $total, $perPage, $currentPage = null, array $options = [])

Странно, что вам нужно передать это вручную, и я бы посчитал это ошибкой.

11

Другие решения

Я не буду жаловаться, если это работа для вас. У нас другой подход к ORM и загрузке моделей, но я надеюсь, что это даст вам некоторое представление.

Начальный URL

localhost/application-name/public/publishers/?page=1

контроллер

class PublisherController extends Controller {
public function index()
{
$publ = Publisher::paginate(5);
$publ->setPath(''); //I just use custom Url and set path to ''
return view('publisher-table', ['publishers'=>$publ]);
}

Посмотреть

<div class="row">
{!! $publishers->render() !!}
</div>

Результирующий URL

localhost/application-name/public/publishers?page=1

Я считаю, что разные конфигурации сервера и подход требуют другого метода. Я, для себя, мой сервер разработки загрязнен проектами, разделенными только папками. Итак, этого решения будет достаточно.

Однажды я прочитал, что вы можете решить эту проблему, установив DocumentRoot в Ларавел public папка. Но будет сочтено ненужным настраивать виртуальный хост для каждой среды разработки.

-1

По вопросам рекламы [email protected]