php - Laravel LengthAware 分页
问题描述
我正在使用 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 页。我该如何解决这个问题通过使用限制偏移我仍然可以继续浏览所有结果,直到我到达最后一页然后禁用分页链接?
解决方案
在给定的代码中使 LengthAwarePaginator 的第二个参数动态如下,它解决了我的问题
$entries = new LengthAwarePaginator($collection, (count($collection)>=101)?$currentPage*$limit:count($collection), $perPage);
推荐阅读
- javascript - 同时运行这两个功能不起作用(Google表格脚本)
- spring - 如何在 Spring Integration 中聚合具有相同标头的消息
- javascript - 有没有办法在每个 onClick 事件做出反应后刷新状态?
- c++ - 在编译时检查静态函数是否存在
- python - 如何从 Flask/jinja2 循环中的列表中删除元素?
- python - 需要基于时间和基于大小的 python 文件轮换的 Concurrent_log_handler
- reactjs - 我在哪里可以添加表单字段,以便它们可以在请求有效负载中发送 POST 方法,我在 React 应用程序中并使用 Fetches
- python - 如何在python中迭代和匹配IP与IP范围(cidr)?
- flutter - 如何在颤动中调用加载方法?
- python - Ambari Agent Distro/Conf 选择版本