8

I need to use paginate and simplepaginate on a collection, so i'm trying to convert the collection into a builder object. To do so I am thinking of creating a function that gets the id of every item in the collection and then builds a query with it, but that seemed to me like a lot of resources waisted, Is there a simpler way ?

1
  • If you could provide some example that would be awesome... regenerating a collection to a builder is not a good idea... its better to paginate a collection directly when fetching a collection from the database.. laravel.com/docs/8.x/pagination#introduction Commented Oct 19, 2021 at 14:30

2 Answers 2

2

A better way to do this is to build paginator object manually using the existing collection.

From the docs:

Sometimes you may wish to create a pagination instance manually, passing it an array of items. You may do so by creating either an Illuminate\Pagination\Paginator or Illuminate\Pagination\LengthAwarePaginator instance, depending on your needs.

The Paginator class does not need to know the total number of items in the result set; however, because of this, the class does not have methods for retrieving the index of the last page. The LengthAwarePaginator accepts almost the same arguments as the Paginator; however, it does require a count of the total number of items in the result set.

In other words, the Paginator corresponds to the simplePaginate method on the query builder and Eloquent, while the LengthAwarePaginator corresponds to the paginate method.

Sign up to request clarification or add additional context in comments.

Comments

1
+50

Building on what Alexey said, as alternative, you can build a Paginator from a collection manually. This is a simpler way without the waste of an additional query. e.g.

 // 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]
    );

Then in your view,

        {!! $paginator->render() !!}

5 Comments

The title of this question is "how to convert a collection object into a builder object" and the bounty request is "Looking for an answer that explicitly answers the question, rather than alternative approaches." -- The answer should not be about building new paginator instances.
Actually, if you edit your answer so I can vote again, I will remove my downvote since this is actually useful/original code.
Edited! (You can’t convert to a Builder instance because the query parameters don’t exist on the Collection instance, and it would be counter productive just for pagination.
And the OP does ask “Is there a simpler way” without the waste of resources
Thanks for the bounty @Jesse

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.