如何在 laravel 中对集合和查询构建器进行分页
How to paginate a collection and query builder in laravel
我的请求中有 +30K 项 table 所以我决定对向用户显示请求的页面进行后端分页。问题是每个用户都没有查看所有请求的权限,它基于很多因素,我做了一个函数 returns 用户是否有权查看请求。
问题出在处理中的请求中,我必须将处理中的每个请求传递给函数以获得权限(处理请求是一小部分项目)。所以我在处理请求时使用了过滤器功能,它给了我 10 个项目的集合。现在我想合并一大组项目,这些项目是关闭的请求,可以是 +10K 项目与处理项目,并使用分页功能。
我该怎么做?
此功能将更多地解释我想说的内容:
public function getRequests(){
$closedRequests = request::join('request_logs', 'request_logs.request_id', '=', 'requests.id')
->select("requests.id", "requests.user_id", "requests.form_type", "requests.created_at", "requests.request_status")
->whereNotIn('request_status', [-2, 0])
->where('request_logs.user_id', Auth::user()->id);
$processingRequests = request::select("requests.id", "requests.user_id", "requests.form_type", "requests.created_at", "requests.request_status")
->where('request_status', 0)
->get()
->filter(function ($request) {
return FormsController::checkUserPermissionToConsultForm($request, true);
});
$closedRequests = $closedRequests->union($processingRequests)
->orderBy('created_at', 'desc')
->paginate(5);
return $closedRequests;
}
上面的函数是我尝试做的,但它产生了一个错误提示
Call to a member function getBindings() on array
您可以创建一个集合并将项目推送到其中,然后使用然后创建一个 class
<?php
namespace App\Support;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection as BaseCollection;
class Collection extends BaseCollection
{
public function paginate($perPage, $total = null, $page = null, $pageName = 'page')
{
$page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
return new LengthAwarePaginator(
$this->forPage($page, $perPage),
$total ?: $this->count(),
$perPage,
$page,
[
'path' => LengthAwarePaginator::resolveCurrentPath(),
'pageName' => $pageName,
]
);
}
}
那你可以这样称呼它
use App\Support\Collection;
$items = [];
$collection = (new Collection($items))->paginate(20);
这个解决方案来自我在 github 上找到的要点。你可以看到它here
我的请求中有 +30K 项 table 所以我决定对向用户显示请求的页面进行后端分页。问题是每个用户都没有查看所有请求的权限,它基于很多因素,我做了一个函数 returns 用户是否有权查看请求。
问题出在处理中的请求中,我必须将处理中的每个请求传递给函数以获得权限(处理请求是一小部分项目)。所以我在处理请求时使用了过滤器功能,它给了我 10 个项目的集合。现在我想合并一大组项目,这些项目是关闭的请求,可以是 +10K 项目与处理项目,并使用分页功能。
我该怎么做?
此功能将更多地解释我想说的内容:
public function getRequests(){
$closedRequests = request::join('request_logs', 'request_logs.request_id', '=', 'requests.id')
->select("requests.id", "requests.user_id", "requests.form_type", "requests.created_at", "requests.request_status")
->whereNotIn('request_status', [-2, 0])
->where('request_logs.user_id', Auth::user()->id);
$processingRequests = request::select("requests.id", "requests.user_id", "requests.form_type", "requests.created_at", "requests.request_status")
->where('request_status', 0)
->get()
->filter(function ($request) {
return FormsController::checkUserPermissionToConsultForm($request, true);
});
$closedRequests = $closedRequests->union($processingRequests)
->orderBy('created_at', 'desc')
->paginate(5);
return $closedRequests;
}
上面的函数是我尝试做的,但它产生了一个错误提示
Call to a member function getBindings() on array
您可以创建一个集合并将项目推送到其中,然后使用然后创建一个 class
<?php
namespace App\Support;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection as BaseCollection;
class Collection extends BaseCollection
{
public function paginate($perPage, $total = null, $page = null, $pageName = 'page')
{
$page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
return new LengthAwarePaginator(
$this->forPage($page, $perPage),
$total ?: $this->count(),
$perPage,
$page,
[
'path' => LengthAwarePaginator::resolveCurrentPath(),
'pageName' => $pageName,
]
);
}
}
那你可以这样称呼它
use App\Support\Collection;
$items = [];
$collection = (new Collection($items))->paginate(20);
这个解决方案来自我在 github 上找到的要点。你可以看到它here