Una biblioteca útil para crear filtros para Eloquent.
Esta biblioteca es útil para crear filtros de búsqueda en su API Rest utilizando Eloquent.
??
La biblioteca Eloquent Filter se puede utilizar para crear patrones para criterios de búsqueda en modelos en su Proyecto Laravel. La idea es agregar filtros simplemente pasando los valores en la carga útil de su solicitud.
Para la instalación, debes utilizar Composer. Ejecute el siguiente comando:
composer require laravellegends/eloquent-filter
El rasgo LaravelLegendsEloquentFilterConcernsHasFilter
se puede utilizar en modelos que aplicarán los filtros de búsqueda.
use LaravelLegends EloquentFilter Concerns HasFilter ;
class User extends Model
{
use HasFilter ;
}
El rasgo HasFilter
proporciona los métodos filter
y withFilter
.
Una forma sencilla de utilizar esta biblioteca en su aplicación Laravel es llamar al método filter
antes de obtener los resultados de su modelo.
Ejemplo:
class UsersController extends Controller
{
use App Models User ;
public function index ()
{
return User :: filter ()-> paginate ();
}
// or
public function index ()
{
return User :: latest ( ' id ' )-> filter ()-> paginate ();
}
// or
public function index ( Request $ request )
{
return User :: filter ( $ request )-> paginate ();
}
}
Puede mostrar los resultados cuando llame /api/users?exact[id]=1
. Se aplicará la consulta SQL "select * from users where (id = 1)"
.
Nota: Muestra la sesión de reglas para más información.
Otra forma es utilizar el filtro específico de un modelo. Puede heredar la clase ModelFilter para crear un filtro personalizado para un modelo.
Para crear esta clase, debes usar el comando php artisan make:filter
, como el siguiente ejemplo:
$ php artisan make:filter UserFilter
El comando anterior generará la siguiente clase:
namespace App Filters ;
use LaravelLegends EloquentFilter Filters ModelFilter ;
class UserFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' role_id ' => ' not_equal ' , // or ['not_equal']
' name ' => [ ' contains ' , ' starts_with ' ],
];
}
}
En controlador
use App Models User ;
use Illuminate Http Request ;
use LaravelLegends EloquentFilter Filter ;
class UsersController extends Controller
{
// api/users?starts_with[name]=Wallace¬_equal[role_id]=2
public function index ( Request $ request )
{
return User :: withFilter ( new UserFilter , $ request )
-> orderBy ( ' name ' )
-> get ();
}
}
El código anterior se llamará internamente como el siguiente ejemplo:
User :: where ( function ( $ query ) {
$ query -> where ( ' name ' , ' LIKE ' , ' Wallace% ' );
$ query -> where ( ' role_id ' , ' <> ' , ' 2 ' );
})
-> orderBy ( ' name ' )
-> get ();
Esta biblioteca aplica internamente filtros basados en parámetros de cadena de consulta con nombres de trabajos clave especiales.
Ver todos los parámetros a continuación:
El valor máximo de una columna. La URL api/users?max[field]=100
es como User::where('field', '<=', 100)
.
El valor mínimo de una columna. La URL api/users?min[age]=33
es como User::where('age', '>=', 33)
.
Un término de búsqueda contenido en una columna. La URL api/users?contains[name]=wallace
es como User::where('name', 'LIKE', '%wallace%')
.
Busque un valor según el contenido final de la cadena. Es similar a un LIKE
con valor %$value
.
Filtre el campo cuando el valor comience con un valor determinado. Una URL api/users?starts_with[name]=brcontainer
suena como User::where('name', 'LIKE', 'brcontainer%')
.
Buscar por un valor exacto del campo · Una URL api/users?exact[email][email protected]
Suena como User::where('name', '=', '[email protected]')
.
Filtrar por relación. Puede utilizar el valor 0
o 1
.
Ejemplo:
La URL api/users?has[posts]=1
es como User::has('posts')
La URL api/users?has[posts]=0
es como User::doesntHave('posts')
Aplique WHERE IS NULL
o WHERE IS NOT NULL
a una consulta.
Ejemplo:
La URL api/users?is_null[cpf]=1
es como User::whereNull('cpf')
La URL api/users?is_null[age]=0
es como User::whereNotNull('age')
Busca cuando una columna NO TIENE los valores pasados.
Ejemplo:
Una URL api/users?not_in[role][]=1¬_in[role][]=2
es equivalente a User::whereNotIn('role', [1, 2])
Nota : Cuando not_in[my_field]
es una matriz vacía, no se realizará ninguna acción.
Busca cuando una columna TIENE los valores pasados.
Ejemplo:
La URL api/users?in[role][]=10&in[role][]=20
suena como User::whereIn('role', [10, 20])
NOTA : Cuando in[my_field]
es una matriz vacía, no se realizará ninguna acción.
Busque por un valor máximo de un campo de fecha.
Una URL api/users?date_max[created_at]=2021-01-01
suena como User::whereDate('created_at', '<=', '2021-01-01')
Busque por un valor mínimo de un campo de fecha.
Ejemplo:
Una URL api/users?date_min[created_at]=2021-01-01
suena como User::whereDate('created_at', '>=', '2021-01-01')
Búsqueda por valor no igual pasado. Si lo utiliza en un campo relacionado, se aplicará dónde no tiene.
Ejemplo:
La URL api/users?not_equal[profile_id]=3
suena como una
User :: where ( ' profile_id ' , ' <> ' , ' 3 ' );
La URL api/users?not_equal[roles.id]=1
suena como una
User :: whereDoesntHave ( ' roles ' , fn ( $ query ) => $ query -> where ( ' id ' , ' = ' , 3 ));
La URL api/users?year_max[created_at]=2000
suena como una
User :: whereYear ( ' created_at ' , ' <= ' , 2000 );
La URL api/users?year_min[created_at]=1998
suena como una
User :: whereYear ( ' created_at ' , ' >= ' , 1998 );
La URL api/users?year_exact[created_at]=1998
suena como una
User :: whereYear ( ' created_at ' , ' = ' , 1998 );
Puede aplicar los filtros de búsqueda en los métodos de relación definidos en su modelo.
Por ejemplo:
Modelo:
class User extends Model
{
use HasFilter ;
public function phones ()
{
return $ this -> hasMany ( Phone ::class, ' user_id ' );
}
}
Filtros:
class UserFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' id ' => [ ' exact ' , ' not_equal ' ],
' created_at ' => [ ' year_exact ' , ' date_max ' , ' date_min ' ],
' phones.number ' => [ ' contains ' ],
// or
' phones ' => new PhoneFilter ,
];
}
}
class PhoneFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' number ' => ' contains '
];
}
}
class UserController extends Controller
{
public function index ()
{
// api/users?not_in[role_id][]=1¬_in[role_id][]=3
// select * from users where (role_id NOT IN (1, 3))
return User :: withFilter ( new UserFilter )-> paginate ();
}
// Or, apply filter as nested query
public function index ()
{
// api/users?exact[role_id]=1
// select * from users where (role_id = 1)
return User :: where ( UserFilter :: toClosure ())-> paginate ();
}
// Or apply in your query as base condition
public function index ()
{
// api/users?exact[role_id]=1
// select * from users where role_id = 1
return User :: tap ( UserFilter :: toClosure ())-> paginate ();
}
}
En el siguiente ejemplo, el usuario será filtrado por el teléfono relacionado que contiene el valor 55
.
La api/users?exact[phones.number]=55
es como:
User :: where ( function ( $ query ) {
$ query -> whereHas ( ' phones ' , function ( $ query ) {
$ query -> where ( ' number ' , ' = ' , ' 55 ' );
});
})-> paginate ();
Si usa la biblioteca axios
, puede usar las opciones params
para incluir los filtros anteriores.
Ejemplo:
const api = axios . create ( {
baseURL : 'http://localhost:8000/api'
} ) ;
api . get ( 'users' , {
params : {
'in[role]' : [ 1 , 2 , 3 ] ,
'contains[name]' : 'Maxters' ,
'is_null[name]' : 0
}
} )