如何在 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