【问题标题】:How to paginate a collection and query builder in laravel如何在 laravel 中对集合和查询生成器进行分页
【发布时间】:2021-06-03 00:52:36
【问题描述】:

我的请求表中有 +30K 项,因此我决定对显示用户请求的页面进行后端分页。问题是每个用户都没有查看所有请求的权限,这取决于很多因素,我创建了一个函数来返回用户是否有权查看请求。

问题在于处理中的请求我必须将处理中的每个请求传递给函数以获得许可(处理请求是一小组项目)。所以我在处理请求时使用了过滤器功能,它给了我 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

【问题讨论】:

    标签: laravel performance vue.js pagination inertiajs


    【解决方案1】:

    您可以创建一个集合并将项目推送到它,然后使用然后创建一个类

    <?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

    【讨论】:

    • 之后我如何将查询生成器与集合分页合并?我正在寻找的结果是集合和查询构建器的 1 个分页
    • 创建一个新的收藏夹,把它们都推进去。然后使用方法
    猜你喜欢
    • 2021-04-18
    • 2015-08-05
    • 2014-03-13
    • 2013-05-30
    • 2018-05-10
    • 2015-09-30
    • 2017-05-03
    • 2017-09-14
    • 2018-02-16
    相关资源
    最近更新 更多