Use query parameters to filter listings
- PHP >= 7.2.0
- Lumen >= 7.0
$ cd lumen-app
$ composer require osi-open-source/lumen-query-builder-filters
{
"require": {
"osi-open-source/lumen-query-builder-filters": "^1.0"
}
}
use Osi\QueryBuilder\Middleware\SearchRequest;
$app->middleware([
SearchRequest::class
]);
With Filters
/users?name=John&with=roles&take=3&skip=15
With JSON Filters
/users?filters={"name":{"value":"John","pattern":"LIKE","not":false}}&skip=2&take=15
In your service
use App\Models\User;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Osi\QueryBuilder\Filter;
/** @var Filter */
protected $filter;
/**
* Base constructor.
* @param Filter $filter
*/
public function __construct(Filter $filter)
{
$this->filter = $filter;
}
/**
* @param array $filters
* @return LengthAwarePaginator
*/
public function list(array $filters = []): LengthAwarePaginator
{
return $this->searchQuery($filters)->paginate($filters['perPage'] ?? null);
}
/**
* @param array $filters
* @param Builder|null $query
* @param Closure|null $middleClosure
* @return Builder
*/
public function searchQuery(array $filters = [], ?Builder $query = null, ?Closure $middleClosure = null): Builder
{
$queryBuilder = $query ?? self::newModelInstance(User::class)->newQuery();
if ($queryBuilder instanceof Model) {
$queryBuilder = $queryBuilder->newQuery();
}
return $this->filter->search($filters, $queryBuilder, $middleClosure);
}