Я работаю с классом Laravel LengthAwarePaginator. Моя проблема в том, что я не могу использовать
$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. Как исправить эта проблема, когда, используя смещение ограничения, я все еще могу просматривать все результаты, пока не дойду до последней страницы, а затем отключу ссылки на страницы?






сделал второй параметр для LengthAwarePaginator динамическим следующим образом в данном коде, это решило мою проблему
$entries = new LengthAwarePaginator($collection, (count($collection)>=101)?$currentPage*$limit:count($collection), $perPage);
вы также можете использовать коллекцию laravel
forPage()laravel.com/docs/5.7/collections#method-forpage