Laravel

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

вы также можете использовать коллекцию laravel forPage()laravel.com/docs/5.7/collections#method-forpage

Omi 12.02.2019 08:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
415
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

сделал второй параметр для LengthAwarePaginator динамическим следующим образом в данном коде, это решило мою проблему

$entries = new LengthAwarePaginator($collection, (count($collection)>=101)?$currentPage*$limit:count($collection), $perPage);

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