Este paquete agrega funcionalidad de búsqueda/filtrado a los modelos Eloquent en Laravel 4/5/6.
También puede encontrar útiles esos paquetes:
Agregue la siguiente línea al archivo composer.json
en su proyecto:
"jedrzej/searchable": "0.0.17"
o ejecute lo siguiente en la línea de comando en la carpeta raíz de su proyecto:
composer require "jedrzej/searchable" "0.0.17"
Para que se pueda realizar búsquedas en un modelo Eloquent, agregue el rasgo al modelo y defina una lista de campos por los que se puede filtrar el modelo. Puede definir una propiedad $searchable o implementar un método getSearchableAttributes si desea ejecutar alguna lógica para definir la lista de campos de búsqueda.
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of searchable fields...
public $ searchable = [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
// ...or a method that returns a list of searchable fields
public function getSearchableAttributes ()
{
return [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
}
}
Para que todos los campos se puedan buscar, coloque un asterisco * en la lista de campos de búsqueda:
public $ searchable = [ ' * ' ];
También es posible incluir en la lista negra los atributos del modelo para evitar que se filtren.
Puede definir una propiedad $notSearchable o implementar un método getNotSearchableAttributes si desea ejecutar alguna lógica para definir la lista de campos de búsqueda.
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of not searchable fields...
public $ notSearchable = [ ' created_at ' ];
// ...or a method that returns a list of not searchable fields
public function getNotSearchableAttributes ()
{
return [ ' created_at ' ];
}
}
Si define ambas listas (columnas con capacidad de búsqueda y columnas sin capacidad de búsqueda), el conjunto resultante de campos con capacidad de búsqueda contendrá todos los atributos incluidos en la lista blanca excepto todos los atributos incluidos en la lista negra.
SearchableTrait
agrega un alcance filtered()
al modelo; puede pasarle una consulta que sea una serie de condiciones de filtro:
// return all posts with forum_id equal to $forum_id
Post :: filtered ([ ' forum_id ' => $ forum_id ])-> get ();
// return all posts with with <operator> applied to forum_id
Post :: filtered ([ ' forum_id ' => <operator>])-> get ();
o usará Request::all()
por defecto:
// if you append ?forum_id=<operator> to the URL, you'll get all Posts with <operator> applied to forum_id
Post :: filtered ()-> get ();
El modo de consulta predeterminado es aplicar la conjunción ( AND
) de todas las consultas al modelo con capacidad de búsqueda. Se puede cambiar a disyunción ( OR
) estableciendo el valor del parámetro de consulta mode
en or
. Si el parámetro de consulta mode
ya está en uso, se utilizará el nombre devuelto por el método getQueryMode
.
SearchableTrait
admite los siguientes operadores:
Los operadores de comparación permiten filtrar según el resultado de la comparación del atributo del modelo y el valor de la consulta. Trabajan para cadenas, números y fechas. Tienen el siguiente formato:
(<operator>)<value>
Están disponibles los siguientes operadores de comparación:
gt
para greater than
la comparaciónge
para comparación greater than or equal
lt
por less than
la comparación, por ejemplole
para comparación les than or equal
Para filtrar publicaciones de 2015 y posteriores, se debe utilizar la siguiente consulta:
?created_at=(ge)2015-01-01
El rasgo de búsqueda permite filtrar por el valor exacto de un atributo o por un conjunto de valores, según el tipo de valor pasado como parámetro de consulta. Si el valor contiene comas, el parámetro se divide en comas y se utiliza como entrada de matriz para el filtrado IN
; de lo contrario, se aplica la coincidencia exacta.
Para filtrar publicaciones del usuario con ID 42, se debe utilizar la siguiente consulta:
?user_id=42
Para filtrar publicaciones de foros con ID 7 u 8, se debe utilizar la siguiente consulta:
?forum_id=7,8
Los operadores similares permiten filtrar mediante la consulta LIKE
. Este operador se activa si se utiliza el operador de coincidencia exacta, pero el valor contiene el signo %
como primer o último carácter.
Para filtrar publicaciones que comienzan con How
, se debe utilizar la siguiente consulta:
?title=How%
Notice:
el carácter porcentual se utiliza para codificar caracteres especiales en las URL, por lo que al enviar la solicitud asegúrese de que las herramientas que utiliza encode the % character as %25
El operador nulo (null)
permite filtrar modelos cuyo atributo es nulo.
Para filtrar publicaciones que no tienen archivos adjuntos, se debe utilizar la siguiente consulta:
?attachment_id=(null)
Es posible obtener resultados negados de una consulta anteponiendo al operador !
.
Algunos ejemplos:
//filter posts from all forums except those with id 7 or 8
?forum_id=!7,8
//filter posts older than 2015
?created_at=!(ge)2015
//filter posts with attachment
?attachment_id=!(null)
Es posible aplicar múltiples restricciones para el atributo de un solo modelo. Para lograrlo, proporcione una serie de filtros de consulta en lugar de un solo filtro:
// filter all posts from year 20** except 2013
?created_at[]=20%&created_at[]=!2013%
Es posible filtrar por atributos de las relaciones del modelo: se aplicará whereHas()
de Eloquent. Para filtrar por relación, agregue el atributo de relación a la lista de campos searchable
en el formulario relation:attribute
. Se debe usar la misma cadena en la consulta para filtrar por el atributo de esa relación, por ejemplo:
// allow filtering on user's active field
protected $searchable = ['user:active'];
// filter only posts of active users
?user:active=1
También es posible negar la búsqueda y filtrar objetos que no tienen una relación coincidente aplicando whereDoesntHave()
de Eloquent. Para hacer eso, anteponga el nombre de la relación con !
:
// allow filtering on comment's approved field
protected $searchable = ['comments:approved'];
// filter only posts that have approved comments
?comments:approved=1
// filter only posts that have not-approved comments
?comments:approved=1
// filter only posts that do not have approved comments
?!comments:approved=1
Si desea filtrar por una relación anidada, simplemente proporcione el nombre de la relación anidada con el punto reemplazado por dos puntos. Es necesario ya que PHP reemplaza automáticamente los puntos con guiones bajos en la URL.
// filter only posts that have comments from active authors
?comments:author:active=1
Es posible procesar filtros seleccionados con su propia lógica, por ejemplo, cuando el nombre del filtro no coincide con el nombre del atributo que se utiliza para el filtrado o es necesario ejecutar algunas operaciones personalizadas. Para anular la lógica del filtro xyz
, deberá definir un método en su modelo llamado processXyzFilter
. Este método debería devolver true
si el filtro se ha procesado y la lógica predeterminada ya no debería ocurrir.
// use one filter to search in multiple columns
protected function processNameFilter ( Builder $ builder , Constraint $ constraint )
{
// this logic should happen for LIKE/EQUAL operators only
if ( $ constraint -> getOperator () === Constraint :: OPERATOR_LIKE || $ constraint -> getOperator () === Constraint :: OPERATOR_EQUAL ) {
$ builder -> where ( function ( $ query ) use ( $ constraint ) {
$ query -> where ( ' first_name ' , $ constraint -> getOperator (), $ constraint -> getValue ())
-> orWhere ( ' last_name ' , $ constraint -> getOperator (), $ constraint -> getValue ());
});
return true ;
}
// default logic should be executed otherwise
return false ;
}
Para anular un filtro para la búsqueda de relaciones, reemplace los dos puntos en el nombre del filtro con un guión bajo. Si desea anular la lógica de user:active
, deberá definir el método processUser_ActiveFilter
.