A simple Laravel pagination merge package that allows you to merge multiple ->paginate()
instances.
I had to deal with something like that in a project I was working on, where in one of the pages I had to display two types of publication paginated and sorted by the created_at field. In my case, it was a Post model and an Event Model (hereinafter referred to as publications).
The only difference is I didn't want to get all the publications from the database and then merge and sort the results, as you can imagine it would rise a performance issue if we have hundreds of publications.
So I figure out that it would be more convenient to paginate each model and only then, merge and sort them. that's why I built this package.
This package is heavily inspired by this stackoverflow answer
Require this package with composer:
composer require aneeskhan47/laravel-pagination-merge
The service provider will be auto-discovered. You do not need to add the provider anywhere.
Require this package with composer:
composer require aneeskhan47/laravel-pagination-merge
Find the providers
key in config/app.php
and register the PaginationMerge Service Provider.
'providers' => [
// ...
Aneeskhan47\PaginationMerge\PaginationMergeServiceProvider::class,
]
Find the aliases
key in config/app.php
and register the PaginationMerge alias.
'aliases' => [
// ...
'PaginationMerge' => Aneeskhan47\PaginationMerge\Facades\PaginationMerge::class,
]
use App\Models\Post;
use App\Models\Event;
use Aneeskhan47\PaginationMerge\Facades\PaginationMerge;
class PublicationsController extends Controller
{
/**
* Display a listing of the resource.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$events = Event::latest()->paginate(5);
$posts = Post::latest()->paginate(5);
$publications = PaginationMerge::merge($events, $posts)
->sortByDesc('created_at')
->get();
// since get() will return \Illuminate\Pagination\LengthAwarePaginator
// you can continue using paginator methods like these etc:
$publications->withPath('/admin/users')
->appends(['sort' => 'votes'])
->withQueryString()
->fragment('users')
->setPageName('publications_page');
return view('publications.index', compact('publications'));
}
}
Do you like this package? Support it by donating
- PayPal: Donate
composer test
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
If you discover any security-related issues, please email [email protected] instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.
This package was generated using the Laravel Package Boilerplate.