opv's avatar
Level 1

Laravel multiple pagination

In basic pagination we get some next url for loading more data, but if those data have more data with pagination as well, how can I customize and use different parameters for different data:

?page=2 to ?posts=2&comments=1

And then use one for one, other for other..

I am using api resource with main UserResource which returns posts with PostsResource which uses pagination and returns CommentsResource whicch uses pagination as well.

0 likes
4 replies
tisuchi's avatar

@opv

The paginate method accepts a $pageName argument. The method is -

public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null), 

so you could do something like ->paginate(15, '[*]', 'posts) and same for comments.

6 likes
opv's avatar
Level 1

@tisuchi Where can I find these in docs I looked everywhere? :D So basically I can use any link and pass into paginate parameter and page number? something like: ?posts=2&comments=1 ->paginate(15, '[*]', 'posts', $request->query('posts')) for postsResource and same for commentsResource? :D

6 likes
tisuchi's avatar
tisuchi
Best Answer
Level 70

@opv

You can change the page name in the pagination.

This is un-documented, but the paginate method looks like this:

public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null) {

So you can set the pageName parameter like this:

Post::paginate(15, '[*]', 'posts')
Comment::paginate(15, '[*]', 'comments')

If you were using blade, it might look like this:

$posts->appends(array_except(Request::query(), 'posts'))->links();
$comments->appends(array_except(Request::query(), 'comments'))->links();

Considering you are using an API, you could access the current page using the meta key.

eg.

posts.meta.current_page
comments.meta.current_page

There is also a setPageName method where you can set the pageName

eg.

$posts = Post::paginate(15);
$posts->setPageName('posts');
6 likes
opv's avatar
Level 1

@tisuchi oh my, thank you so much! adding a div after the template to wrap everything in made it work!

5 likes

Please or to participate in this conversation.