Este pacote facilita a obtenção de pesquisas estruturadas em diversas fontes. Aqui está um exemplo onde pesquisamos alguns modelos. Já fizemos uma pequena preparação nos próprios modelos.
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
A pesquisa será realizada sem distinção entre maiúsculas e minúsculas. $searchResults
agora contém todos os modelos User
que contêm john
no atributo name
e BlogPost
s que contêm 'john' no atributo title
.
Na sua visualização, agora você pode percorrer os resultados da pesquisa:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< li >< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a ></ li >
</ ul >
@endforeach
@endforeach
Neste exemplo usamos modelos, mas você pode facilmente adicionar um aspecto de pesquisa para uma API externa, uma lista de arquivos ou um array de valores.
Investimos muitos recursos na criação dos melhores pacotes de código aberto. Você pode nos apoiar comprando um de nossos produtos pagos.
Agradecemos muito que você nos envie um cartão postal de sua cidade natal, mencionando qual(is) de nossos pacotes você está usando. Você encontrará nosso endereço em nossa página de contato. Publicamos todos os cartões postais recebidos em nosso mural virtual de cartões postais.
Você pode instalar o pacote via compositor:
composer require spatie/laravel-searchable
Para pesquisar modelos você terá que deixá-los implementar a interface Searchable
.
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
Você só precisará adicionar um método getSearchResult
a cada modelo pesquisável que deve retornar uma instância de SearchResult
. Veja como seria um modelo de postagem de blog.
use Spatie Searchable Searchable ;
use Spatie Searchable SearchResult ;
class BlogPost extends Model implements Searchable
{
public function getSearchResult (): SearchResult
{
$ url = route ( ' blogPost.show ' , $ this -> slug );
return new Spatie Searchable SearchResult (
$ this ,
$ this -> title ,
$ url
);
}
}
Com os modelos preparados você pode pesquisá-los assim:
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
A pesquisa será realizada sem distinção entre maiúsculas e minúsculas. $searchResults
agora contém todos os modelos User
que contêm john
no atributo name
.
Você também pode passar vários atributos para pesquisar:
// use multiple model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' first_name ' , ' last_name ' )
-> search ( ' john ' );
// or use an array of model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, [ ' first_name ' , ' last_name ' ])
-> search ( ' john ' );
Para obter um controle refinado, você também pode usar um callable. Dessa forma, você também pode pesquisar correspondências exatas, aplicar escopos, relacionamentos de carga antecipada ou até mesmo filtrar sua consulta como faria usando o construtor de consultas.
$ search = ( new Search ())
-> registerModel ( User ::class, function ( ModelSearchAspect $ modelSearchAspect ) {
$ modelSearchAspect
-> addSearchableAttribute ( ' name ' ) // return results for partial matches on usernames
-> addExactSearchableAttribute ( ' email ' ) // only return results that exactly match the e-mail address
-> active ()
-> has ( ' posts ' )
-> with ( ' roles ' );
});
Você não está limitado apenas a registrar modelos básicos como aspectos de pesquisa. Você pode criar facilmente seus próprios aspectos de pesquisa personalizados estendendo a classe SearchAspect
.
Considere o seguinte aspecto de pesquisa personalizada para pesquisar uma API externa:
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
É assim que você pode usá-lo:
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
É possível limitar a quantidade de resultados retornados por cada aspecto chamando limitAspectResults
antes de realizar a pesquisa.
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
Aqui está um exemplo de renderização de resultados de pesquisa:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a >
</ ul >
@endforeach
@endforeach
Você pode personalizar o $type
adicionando uma propriedade pública $searchableType
em seu modelo ou aspecto de pesquisa personalizado
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
Consulte CHANGELOG para obter mais informações sobre o que mudou recentemente.
Consulte CONTRIBUINDO para obter detalhes.
Se você encontrou um bug relacionado à segurança, envie um email para [email protected] em vez de usar o rastreador de problemas.
A licença MIT (MIT). Consulte Arquivo de licença para obter mais informações.