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

Posted

技术标签:

【中文标题】Laravel,如何将集合对象转换为构建器对象【英文标题】:Laravel, how to convert a collection object into a builder object 【发布时间】:2018-07-27 16:30:00 【问题描述】:

我需要在集合上使用 paginate 和 simplepaginate,所以我试图将集合转换为构建器对象。 为此,我正在考虑创建一个函数,该函数获取集合中每个项目的 id,然后用它构建一个查询,但在我看来,这似乎占用了很多资源, 有没有更简单的方法?

【问题讨论】:

如果你能提供一些很棒的例子......将集合重新生成给构建器不是一个好主意......最好在从数据库中获取集合时直接对集合进行分页。 .laravel.com/docs/8.x/pagination#introduction 【参考方案1】:

更好的方法是使用现有集合build paginator object manually。

来自the docs:

有时您可能希望手动创建一个分页实例,向其传递一组项目。您可以根据需要创建Illuminate\Pagination\PaginatorIlluminate\Pagination\LengthAwarePaginator 实例来实现。

Paginator 类不需要知道结果集中的项目总数;但是,正因为如此,该类没有检索最后一页索引的方法。 LengthAwarePaginator 接受与Paginator 几乎相同的参数;但是,它确实需要计算结果集中的项目总数。

也就是说,Paginator 对应于查询构建器和 Eloquent 上的 simplePaginate 方法,而LengthAwarePaginator 对应于 paginate 方法。

【讨论】:

【参考方案2】:

在 Alexey 所说的基础上,作为替代方案,您可以手动从集合构建 Paginator。这是一种更简单的方法,不会浪费额外的查询。例如

 // Collection $collection
 
$perPage       = 10;
$currentPage   = Illuminate\Pagination\Paginator::resolveCurrentPage() ?? 1;
$itemsOnPage   = $collection->skip(10 * ($currentPage-1))->take($perPage);
$paginatorPath = Illuminate\Pagination\Paginator::resolveCurrentPath();

$paginator     = new \Illuminate\Pagination\LengthAwarePaginator(
        $itemsOnPage,
        $collection->count(),
        $perPage,
        $currentPage,
        ['path' => $paginatorPath]
    );

那么在你看来,

        !! $paginator->render() !!

【讨论】:

这个问题的标题是“如何将集合对象转换为构建器对象”,赏金请求是“寻找明确回答问题的答案,而不是替代方法。” -- 答案不应该是构建新的分页器实例。 实际上,如果您编辑答案以便我再次投票,我将删除我的反对票,因为这实际上是有用的/原始代码。 已编辑! (您不能转换为 Builder 实例,因为 Collection 实例上不存在查询参数,并且仅对分页会适得其反。 而且 OP 确实会问“有没有更简单的方法”而不浪费资源 感谢@Jesse 的赏金

以上是关于Laravel,如何将集合对象转换为构建器对象的主要内容,如果未能解决你的问题,请参考以下文章

laravel怎么把对象转换为数组

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

如何将多维数组转换为Laravel中的集合

如何将 laravel 模型工厂创建方法返回的对象转换为包含模型字段的数组?

如何将对象(模型类型对象)插入到 Laravel 中特定索引号的集合对象中?

如何为three.js模型加载器将对象转换为json文件