Длина 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);

Другие вопросы по тегам