Laravel Multiple Pagination in one page
I'm having some trouble with my pagination. I'm having two tables with data from a database and I paginated it with laravel Paginator.
Now my problem is when you go to, for example, page 2 it adds ?page=2 but that makes the first table go to page 2 too.
Is there anyway to get something like this ?
page_table1={number}&page_table2={number}
so you don't apply the page change on other tables.
Solution 1:
$publishedArticles = Article::paginate(10, ['*'], 'published');
$unpublishedArticles = Article::paginate(10, ['*'], 'unpublished');
The third argument is used as follows:
laravel/public/articles?published=3
laravel/public/articles?unpublished=1
Solution 2:
This is an easy solution I've found on Laravel 4.
Controller
Change the page name before you make the paginator:
Paginator::setPageName('page_a');
$collection_A = ModelA::paginate(10);
Paginator::setPageName('page_b');
$collection_B = ModelB::paginate(10);
View
Do the same: change the page name before you print the links
Paginator::setPageName('page_a');
$collection_A->links();
Paginator::setPageName('page_b');
$collection_B->links();
If you don't want to lose any page state while you navigate to another page, append to the links the current page from all collections:
Paginator::setPageName('page_a');
$collection_A->appends('page_b', Input::get('page_b',1))->links();
Paginator::setPageName('page_b');
$collection_B->appends('page_a', Input::get('page_a',1))->links();
Solution 3:
Unfortunately I can't test this code right now, but browsing at the docs and the code (in Illuminate/Pagination/Environment
) I guess you could something like this:
# use default 'page' for this
$collection1 = Model::paginate(20);
# use custom 'other_page' for this
$collection2 = Model2::paginate(20);
$collection2->setPageName('other_page');
The setPageName()
method isn't documented in the docs, but it's a public method alongside those indicated in the documentation, so it should be working fine. FOr reference, this is the declaration (l. 171-180 in vendor/laravel/framework/src/Illuminate/Pagination/Environment.php
):
/**
* Set the input page parameter name used by the paginator.
*
* @param string $pageName
* @return void
*/
public function setPageName($pageName)
{
$this->pageName = $pageName;
}
Now take into consideration that you will have another query string appended to the url, so you need to tell the pagination to consider it. Use the appends()
method:
$collection1->appends(array_except(Request::query(), 'page'))->links();
$collection2->appends(array_except(Request::query(), 'other_page'))->links();
That is, tell each Presenter to build up the url with all the query strings (the array resulting from Request::query()
without the current index used by the paginator, or you'll end up with a double value). array_except()
is a Laravel built in array helper that returns the given array (1st parameter) purged of the passed index (2nd parameter).
I'll try to test this code as soon as I can, but it should work. Let me know in any case!
Solution 4:
in laravel 5.3 (maibe working in other laravel 5 version), i use like this:
$produk = Produk::paginate(5, ['*'], 'produk');
$region = Region::paginate(5, ['*'], 'region');
and in blade templating append links currents of other to keep the position:
{{$produk->appends(['region' => $region->currentPage()])->links()}}
{{$region->appends(['produk' => $produk->currentPage()])->links()}}