如何合并集合和查询构建器,然后在其上使用分页 Laravel 8

Posted

技术标签:

【中文标题】如何合并集合和查询构建器,然后在其上使用分页 Laravel 8【英文标题】:How to merge collection and Query builder then use paginate on it Laravel 8 【发布时间】:2021-08-19 23:29:47 【问题描述】:

我有一个构建器对象和一个集合,我想将它们组合起来并使用 laravel 的分页。

我该怎么做?

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

【问题讨论】:

【参考方案1】:

好吧,在 Laravel 中没有可用的默认方法来做这些事情。您可以根据需要使用Illuminate\Pagination\PaginatorIlluminate\Pagination\LengthAwarePaginator 制作一个。 Illuminate\Pagination\Paginator 指的是simplePaginate() 方法,其中Illuminate\Pagination\LengthAwarePaginator 指的是paginate 方法。

另一种方法是将构建器结果转换为集合。然后合并builder集合和$processingRequests集合,并使用forPage()方法,这也是一个集合方法,通过一些修改生成分页。

以下是参考:

自定义分页:https://laravel.com/docs/8.x/pagination#manually-creating-a-paginator

forPage:

https://laravel.com/docs/8.x/collections#method-forpage https://stillat.com/blog/2018/04/22/laravel-5-collections-paginating-collections-with-forpage

【讨论】:

如果我在每个集合中有 20K 项,那会有效吗? 这完全是一个不同的问题,你这样编码。分页只不过是为传递给数据库的查询添加限制和偏移量。在您的代码中,您已经在获取所有数据然后进行过滤,在更大的数据集上肯定需要时间。在这种情况下,您可以使用 chunk() 方法或 cursor() 方法来处理这种情况

以上是关于如何合并集合和查询构建器,然后在其上使用分页 Laravel 8的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5 中对合并的集合进行分页?

如何在查看器中使用 Autodesk.Viewing.MarkupsCore 扩展,以便我可以在其上绘图?

如何合并两个模型集合并使其成为一个分页然后将其发送到 Laravel 中的视图

Laravel,如何将集合对象转换为构建器对象

如何在 SQL 中保存数据并在其上循环?

如何将 websocket 实例传递给 vue.js 组件,然后在其上调用 send()?