我的请求表中有+30K个项目,所以我决定对向用户显示请求的页面进行后端分页。问题是,每个用户都没有查看所有请求的权限,这是基于许多因素,我制作了一个函数来返回用户是否有查看请求的权限。
问题是在处理中的请求中,我必须将处理中的每个请求都传递给函数以获得权限(处理请求是一组小项目(。所以我在处理请求时使用了filter函数,它给了我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
您可以创建一个集合并将项目推送到其中,然后使用创建一个类
<?php
namespace AppSupport;
use IlluminatePaginationLengthAwarePaginator;
use IlluminateSupportCollection 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 AppSupportCollection;
$items = [];
$collection = (new Collection($items))->paginate(20);
这个解决方案来自我在github上找到的一个要点。你可以在这里看到