Skip to content

Merge multiple Laravel paginate instances - Supports Laravel 5/6/7/8/9/10/11

License

Notifications You must be signed in to change notification settings

aneeskhan47/laravel-pagination-merge

Repository files navigation

Pagination Merge for Laravel 5/6/7/8/9/10/11

Latest Version on Packagist Total Downloads GitHub Code Style Action Status Laravel Versions

A simple Laravel pagination merge package that allows you to merge multiple ->paginate() instances.

Some Background

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

⚡️ Installation

For Laravel 5.5+

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.

For Laravel 5.0 to 5.4

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,
]

🚀 Usage

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'));
    }
}

💰 Support the development

Do you like this package? Support it by donating

🧪 Testing

composer test

📝 Changelog

Please see CHANGELOG for more information on what has changed recently.

🤝 Contributing

Please see CONTRIBUTING for details.

🔒 Security

If you discover any security-related issues, please email [email protected] instead of using the issue tracker.

🙌 Credits

📜 License

The MIT License (MIT). Please see License File for more information.

🔧 Laravel Package Boilerplate

This package was generated using the Laravel Package Boilerplate.

About

Merge multiple Laravel paginate instances - Supports Laravel 5/6/7/8/9/10/11

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages