This package allows you to filter, sort and include eloquent relations based on a request. The QueryFilter used in this package extends Laravel's default Eloquent builder. This means all your favorite methods and macros are still available.
- PHP 8.2+
- Laravel 10/11/12
Follow the steps below to install the package.
composer require samushi/queryfilter
This package helps you easily filter your Eloquent queries based on request parameters.
Step 1: Create a Filters
directory inside your app
folder, then create filter classes:
Step 2: Create a filter class (e.g., Search.php
):
namespace App\Filters;
use Samushi\QueryFilter\Filter;
use Illuminate\Database\Eloquent\Builder;
class Search extends Filter
{
/**
* Search results using whereLike
*
* @param Builder $builder
* @return Builder
*/
protected function applyFilter(Builder $builder): Builder
{
// Search with relationship: ['name', 'posts.title']
return $builder->whereLike(['name'], $this->getValue());
}
}
Note: Filter class names must match request parameter names. For example, the Search
class corresponds to request()->input('search')
.
namespace App\Http\Controllers;
use App\Models\User;
use App\Filters\Search;
use Samushi\QueryFilter\Facade\QueryFilter;
class UserController extends Controller
{
public function index()
{
$filters = [
Search::class,
// Add more filters here
];
return QueryFilter::query(User::query(), $filters)->paginate(10);
}
}
Search in multiple columns or relationships:
// Search in name column
$users = User::whereLike(['name'], $searchTerm)->get();
// Search in name and email columns
$users = User::whereLike(['name', 'email'], $searchTerm)->get();
// Search in relationship columns
$users = User::whereLike(['name', 'posts.title'], $searchTerm)->get();
Filter records between two dates:
// Default format: d/m/Y
$users = User::whereDateBetween('created_at', '01/01/2023', '31/12/2023')->get();
// Custom formats
$users = User::whereDateBetween('created_at', '01-01-2023', '31-12-2023', 'd-m-Y', 'Y-m-d')->get();
You can create custom filters by extending the base Filter
class:
namespace App\Filters;
use Samushi\QueryFilter\Filter;
use Illuminate\Database\Eloquent\Builder;
class PriceRange extends Filter
{
protected function applyFilter(Builder $builder): Builder
{
$range = explode(',', $this->getValue());
if (count($range) === 2) {
return $builder->whereBetween('price', [$range[0], $range[1]]);
}
return $builder;
}
}
Then use it in your controller:
// Usage: ?price_range=10,100
The MIT License (MIT). Please see the License File for more information.