Длина LaravelAwarePagination
Я работаю с классом LengthAwarePaginator от laravel. Моя проблема в том, что я не могу использовать
$users = DB::table('users')->paginate(15);
или, другими словами, конструктор запросов larvel или красноречивые результаты. Причина в том, что я предоставил пользователю интерфейс, где он может динамически создавать запросы, которые могут быть такими же простыми, как запрос на выборку, и такими же сложными, как запросы с несколькими объединениями и т. Д. Поэтому у меня остается только опция использования LengthAwarePaginator. Вот что я сделал далеко
private function queryWithPagination($queryString,$path,$fieldName = '',$sortOrder = '',$perPage = 100){
$queryString = str_replace(''',"'",$queryString);
$queryString = str_replace('**',"",$queryString);
if(!empty($fieldName) && !empty($sortOrder)){
$queryString .= " ORDER BY '{$fieldName}' {$sortOrder}";
}
$currentPage = LengthAwarePaginator::resolveCurrentPage();
$limit = $perPage +1; // to have pagination links clickable i.e next,previous buttons
$queryString.= " LIMIT {$limit}";
if($currentPage == 1){
$queryString.= " OFFSET 0";
}
else{
$offset = ($currentPage-1)*$perPage;
$queryString.= " OFFSET {$offset}";
}
$path = preg_replace('/&page(=[^&]*)?|^page(=[^&]*)?&?/','', $path);
$result = DB::connection('database')->select($queryString);
$collection = new Collection($result);
//$currentPageSearchResults = $collection->slice(($currentPage - 1) * $perPage, $perPage)->all();
$entries = new LengthAwarePaginator($collection, count($collection), $perPage);
$entries->setPath($path);
//dd($queryString,$result);
dd($entries);
return $entries;
}
Как вы можете видеть, я добавляю LIMIT и OFFSET в запросе в противном случае, для сложных запросов время загрузки увеличивалось, что приводило к ухудшению взаимодействия с пользователем. Проблема с текущими настройками состоит в том, что последняя страница всегда имеет значение 2, и когда я попадаю на вторую страницу, я не могу просмотреть больше результатов, т.е. в случаях, когда количество возвращенных записей превышает 500, я все еще могу просматривать только страницу 2. Как исправить эта проблема, где с помощью предельного смещения я могу продолжать просматривать все результаты, пока не доберусь до последней страницы, а затем отключу ссылки на страницы?
1 ответ
Сделал второй параметр LengthAwarePaginator динамическим, как показано в приведенном ниже коде, это решило мою проблему
$ records = new LengthAwarePaginator($collection, (count($collection)>=101)?$currentPage*$limit:count($collection), $perPage);