Laravel LengthAwarePaginator

Laravel LengthAwarePagination

我正在使用 laravel 的 LengthAwarePaginator Class。我的问题是我无法使用

$users = DB::table('users')->paginate(15);

或者换句话说,larvel 的查询生成器或 eloquent 结果。原因是我为用户提供了一个前端,他们可以在其中动态创建查询,这些查询可以像 select 查询一样简单,也可以像具有多个连接的查询一样复杂。所以我只能选择使用 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);