hasnath/queryable is a Laravel package for laravel queryable.
It currently has 1 GitHub stars and 10 downloads on Packagist (latest version v0.1.0).
Install it with composer require hasnath/queryable.
Discover more Laravel packages by hasnath
or browse all Laravel packages to compare alternatives.
Last updated
Queryable gives you query builder helpers such as Filter and OrderBy to make APIs easier to create.
The following is required to use Queryable
Laravel
PHP 7
To get started, install Queryable via the Composer package manager:
composer require hasnath/queryable
Add the QueryableServiceProvider to your providers in config/app.php
HasnatH\Queryable\Providers\QueryableServiceProvider::class
Publish the configuration file
php artisan vendor:publish --provider="HasnatH\Queryable\Providers\QueryableServiceProvider"
The configuration file will be published config/queryable.php
<?php
return [
'filter' => [
'separator' => env('QUERYABLE_FILTER_SEPARATOR', ',')
],
'orderBy' => [
'separator' => env('QUERYABLE_ORDER_BY_SEPARATOR', ',')
],
];
Instantiate a new Queryable and pass in the Model to be used
Use the available Queryable methods
<?php
use App\User;
use HasnatH\Queryable\Queryable;
class UserService
{
protected $queryable;
public function index()
{
$queryable = new Queryable(User::class);
$query = User::query();
$query = $queryable->filter($query, request()->get('filter'));
$query = $queryable->orderBy($query, request()->get('orderBy'));
return $query->get();
}
}
Queryable gives you the ability to easily filter database queries
Specific configuration for the filter method can be found in the filter array inconfig/queryable.php
As default, all fields in a model can be filtered
To override which fields you want to filter by add the following in to your model
public static $filterable = [
'first_name',
'last_name'
];
Any filters that contain a field that is not present in the model/filterable will be ignored.
To apply filters, call the filter method on your Queryable instance.
The filter method accepts two parameters: $query, $filters
The $query parameter is an instance of your query builder
$query = User::query();
$query = auth()->user();
The $filter parameter is an array of your filters in the following format
[
"FIELD,VALUE,OPERATOR",
]
The FIELD and VALUE fields are required for each filter.
The OPERATOR field is optional and will default to =
The following OPERATORS can be used
=
<
>
<=
>=
<>
!=
LIKE
NOT LIKE
BETWEEN
ILIKE
You can apply as many filters as you would like.
For example, to apply filters for first_name and last_name:
[
["first_name,John"],
["last_name,Smith"]
]
The default separator for the filter method is ,
This value is retrieved from config/queryable.php filter.separator
To change the separator, update the filter.separator value in the config or add an .env variable
QUERYABLE_FILTER_SEPARATOR=|
You will then need to pass filters in the following format
[
["first_name|John"],
["last_name|Smith"]
]
The following will pass any filters passed via the request and apply them
public function index()
{
$queryable = new Queryable(User::class);
$filters = request()->get('filter');
$query = User::query();
$query = $queryable->filter($query, $filters);
return $query->get();
}
To get the users that have the first_name John and id greater than 3
GET /users?filter[]=first_name,John&filter[]=id,3,>
Queryable gives you the ability to easily order database queries
Specific configuration for the orderBy method can be found in the orderBy array inconfig/queryable.php
As default, you can apply an order on all fields in a model
To override which fields you want to order by add the following in to your model
public static $orderable = [
'first_name',
'last_name'
];
Any orders that contain a field that is not present in the model/orderable will be ignored.
To apply ordering, call the orderBy method on your Queryable instance.
The orderBy method accepts two parameters: $query, $fields
The $query parameter is an instance of your query builder
$query = User::query();
$query = auth()->user();
The $fields parameter is an array of your order fields in the following format
[
"FIELD,ORDER",
]
The FIELD field is required for each order.
The ORDER field is optional and will default to ASC
The following ORDER values can be used
ASC
DESC
You can apply as many orders as you would like.
For example, to order by first_name and then last_name
[
["first_name"],
["last_name,DESC"]
]
The default separator for the orderBy method is ,
This value is retrieved from config/queryable.php orderBy.separator
To change the separator, update the orderBy.separator value in the config or add an .env variable
QUERYABLE_ORDER_BY_SEPARATOR=|
You will then need to pass filters in the following format
[
["first_name"],
["last_name|DESC"]
]
The following will pass any orders passed via the request and apply them
public function index()
{
$queryable = new Queryable(User::class);
$filters = request()->get('filter');
$query = User::query();
$query = $queryable->orderBy($query, $filters);
return $query->get();
}
To order by the first_name in ascending order and then the id in descending order
GET /users?orderBy[]=first_name&orderBy[]=id,DESC
Queryable is open-sourced software licensed under the MIT license.