stepovenko/eloquent-filter-sort-pagination

For filtering and sorting in eloquent

1.0.9 2022-03-25 08:14 UTC

This package is auto-updated.

Last update: 2024-04-25 12:38:40 UTC


README

Simple filtering and sorting of data in Eloquent uses query parameters for example

Simple example

https://example.com?sort=price-desc&name=iphone

<?php

namespace App\Http\Controllers;

use App\Filters\ProductFilter;
use App\Models\Product;

class ProductController extends Controller
{
    public function index(ProductFilter $productFilter)
    {
        return Product::paginationFilter($productFilter);
    }
}
<?php

namespace App\Filters;

use Stepovenko\FilterableAndSortable\Filters\QueryFilter;

class ProductFilter extends QueryFilters
{
    public function getFilterableFields(): array
    {
        return ['name'];
    }

    public function getSortableFields(): array
    {
        return ['price'];
    }

    public function name($term)
    {
        $this->builder->where('products.name', 'LIKE', "%$term%");
    }
}

Or you can use

$products = Product::filter($productFilter)->paginationFilter();

$products = Product::filter($productFilter)->get();

$products = Product::filter($productFilter)->pagination();

Console command to create a filter

php arisan make:filter Product

Additional methods and variables

<?php

namespace App\Filters;

use Stepovenko\FilterableAndSortable\Filters\QueryFilter;

class ProductFilter extends QueryFilters
{
    protected string $defaultSort = 'price-asc';
    protected int $maxPerPage = 100;
    protected int $defaultPerPage = 15;

    public function getSortableFields(): array
    {
        return ['category_name'];
    }

    // if you saved price as string
    public function getSortableFieldsLikeNumber(): array
    {
        return ['price'];
    }

    // override standard sort prefix sort_
    public function sort_categories_name($term)
    {
        $this->builder->where('category.name', 'LIKE', "%$term%");
    }
}

internal public methods

<?php

namespace App\Http\Controllers;

use App\Filters\ProductFilter;
use App\Models\Product;

class ProductController extends Controller
{

    public function index(ProductFilter $productFilter)
    {
        // internal public methods
        $productFilter->setDefaultSort('price-desc');
        $perPega = $productFilter->getPerPage();
        $request = $productFilter->getRequest();
        $builder = $productFilter->getBuilder();
    }

}

You can change the way you sort and filter over classes

config publication

php artisan vendor:publish --tag=filterable-and-sortable-config