В настоящее время я обновляю один из моих проектов до 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;
Любая помощь приветствуется.
Спасибо!
Я наконец исправил это после нескольких часов работы!
Я узнал, что вы можете пройти путь к пагинатору.
Как вы можете видеть, это можно сделать, передав массив в качестве 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 = [])
Странно, что вам нужно передать это вручную, и я бы посчитал это ошибкой.
Я не буду жаловаться, если это работа для вас. У нас другой подход к ORM и загрузке моделей, но я надеюсь, что это даст вам некоторое представление.
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>
localhost/application-name/public/publishers?page=1
Я считаю, что разные конфигурации сервера и подход требуют другого метода. Я, для себя, мой сервер разработки загрязнен проектами, разделенными только папками. Итак, этого решения будет достаточно.
Однажды я прочитал, что вы можете решить эту проблему, установив DocumentRoot
в Ларавел public
папка. Но будет сочтено ненужным настраивать виртуальный хост для каждой среды разработки.