1

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

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

或者换句话说,larvel 的 querybuilder 或者 eloquent 结果。原因是我为用户提供了一个前端,他们可以在其中动态创建查询,这些查询可以像选择查询一样简单,也可以像具有多个连接的查询一样复杂。所以我只能选择使用 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 页。我该如何解决这个问题通过使用限制偏移我仍然可以继续浏览所有结果,直到我到达最后一页然后禁用分页链接?

4

1 回答 1

0

在给定的代码中使 LengthAwarePaginator 的第二个参数动态如下,它解决了我的问题

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

于 2019-02-12T09:27:23.573 回答