Este pacote adiciona funcionalidade de pesquisa/filtragem aos modelos Eloquent no Laravel 4/5/6.
Você também pode achar esses pacotes úteis:
Adicione a seguinte linha ao arquivo composer.json
em seu projeto:
"jedrzej/searchable": "0.0.17"
ou execute o seguinte na linha de comando na pasta raiz do seu projeto:
composer require "jedrzej/searchable" "0.0.17"
Para tornar um modelo do Eloquent pesquisável, adicione a característica ao modelo e defina uma lista de campos pelos quais o modelo pode ser filtrado. Você pode definir uma propriedade $searchable ou implementar um método getSearchableAttributes se desejar executar alguma lógica para definir a lista de campos pesquisáveis.
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 tornar todos os campos pesquisáveis coloque um asterisco * na lista de campos pesquisáveis:
public $ searchable = [ ' * ' ];
Também é possível colocar os atributos do modelo na lista negra para evitar que ele seja filtrado.
Você pode definir uma propriedade $notSearchable ou implementar um método getNotSearchableAttributes se desejar executar alguma lógica para definir a lista de campos pesquisáveis.
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 ' ];
}
}
Se você definir ambas as listas - colunas pesquisáveis e não pesquisáveis - o conjunto resultante de campos pesquisáveis conterá todos os atributos da lista branca, exceto todos os atributos da lista negra.
SearchableTrait
adiciona um escopo filtered()
ao modelo - você pode passar uma consulta para ele como uma matriz de condições 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 ();
ou usará Request::all()
como padrão:
// if you append ?forum_id=<operator> to the URL, you'll get all Posts with <operator> applied to forum_id
Post :: filtered ()-> get ();
O modo de consulta padrão é aplicar a conjunção ( AND
) de todas as consultas ao modelo pesquisável. Ele pode ser alterado para disjunção ( OR
) definindo o valor do parâmetro de consulta mode
or
. Se o parâmetro de consulta mode
já estiver em uso, o nome retornado pelo método getQueryMode
será usado.
O SearchableTrait
oferece suporte aos seguintes operadores:
Os operadores de comparação permitem a filtragem com base no resultado da comparação do atributo do modelo e do valor da consulta. Eles funcionam para strings, números e datas. Eles têm o seguinte formato:
(<operator>)<value>
Os seguintes operadores de comparação estão disponíveis:
gt
para greater than
comparaçãoge
para comparação greater than or equal
lt
por less than
comparação, por exemplole
para comparação les than or equal
Para filtrar postagens de 2015 e mais recentes, a seguinte consulta deve ser usada:
?created_at=(ge)2015-01-01
A característica pesquisável permite filtrar pelo valor exato de um atributo ou por um conjunto de valores, dependendo do tipo de valor passado como parâmetro de consulta. Se o valor contiver vírgulas, o parâmetro será dividido em vírgulas e usado como entrada de matriz para filtragem IN
, caso contrário, a correspondência exata será aplicada.
Para filtrar postagens do usuário com id 42, a seguinte consulta deve ser usada:
?user_id=42
Para filtrar postagens de fóruns com id 7 ou 8, a seguinte consulta deve ser utilizada:
?forum_id=7,8
Operadores semelhantes permitem a filtragem usando a consulta LIKE
. Este operador é acionado se o operador de correspondência exata for usado, mas o valor contém o sinal %
como primeiro ou último caractere.
Para filtrar postagens que começam com How
, a seguinte consulta deve ser usada:
?title=How%
Notice:
o caractere de porcentagem é usado para codificar caracteres especiais em URLs, portanto, ao enviar a solicitação, certifique-se de que as ferramentas usadas encode the % character as %25
Operador nulo (null)
permite filtrar modelos cujo atributo é nulo.
Para filtrar postagens que não possuem anexo, deve-se utilizar a seguinte consulta:
?attachment_id=(null)
É possível obter resultados negados de uma consulta acrescentando !
.
Alguns exemplos:
//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)
É possível aplicar múltiplas restrições para um único atributo do modelo. Para conseguir isso, forneça uma variedade de filtros de consulta em vez de um único filtro:
// filter all posts from year 20** except 2013
?created_at[]=20%&created_at[]=!2013%
É possível filtrar por atributos das relações do modelo - será aplicado whereHas()
do Eloquent. Para filtrar por relação, adicione o atributo de relação à lista de campos searchable
no formato relation:attribute
. A mesma string deve ser usada na consulta para filtrar pelo atributo daquela relação, ex.:
// allow filtering on user's active field
protected $searchable = ['user:active'];
// filter only posts of active users
?user:active=1
Também é possível negar a pesquisa e filtrar objetos que não possuem uma relação de correspondência aplicando whereDoesntHave()
do Eloquent. Para fazer isso, prefixe o nome da relação com !
:
// 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
Se você deseja filtrar por uma relação aninhada, basta fornecer o nome da relação aninhada com o ponto substituído por dois pontos. É necessário porque o PHP substitui automaticamente os pontos por sublinhados na URL.
// filter only posts that have comments from active authors
?comments:author:active=1
É possível processar filtros selecionados com sua própria lógica, por exemplo, quando o nome do filtro não corresponde ao nome do atributo usado para filtragem ou quando algumas operações personalizadas precisam ser executadas. Para substituir a lógica do filtro xyz
, você precisará definir um método em seu modelo chamado processXyzFilter
. Este método deve retornar true
, se o filtro tiver sido processado e a lógica padrão não ocorrer mais.
// 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 substituir um filtro para pesquisa de relação, substitua os dois pontos no nome do filtro por sublinhado. Se você quiser substituir a lógica de user:active
, precisará definir o método processUser_ActiveFilter
.