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

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

【问题讨论】:

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

标签: laravel collections builder


【解决方案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 的赏金
    猜你喜欢
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    相关资源
    最近更新 更多