Este pacote Laravel permite pesquisar vários modelos do Eloquent. Ele suporta classificação, paginação, consultas com escopo, relacionamentos de carregamento rápido e pesquisa em colunas únicas ou múltiplas.
❤️ Temos orgulho de apoiar a comunidade desenvolvendo pacotes Laravel e distribuindo-os gratuitamente. Se este pacote economiza seu tempo ou se você confia nele profissionalmente, considere patrocinar a manutenção e o desenvolvimento e confira nosso pacote premium mais recente: Mesa de Inércia. Acompanhar problemas e solicitações pull leva tempo, mas ficaremos felizes em ajudar!
Se você quiser saber mais sobre o histórico deste pacote, leia a postagem do blog.
Você pode instalar o pacote via compositor:
composer require protonemedia/laravel-cross-eloquent-search
get
foi renomeado para search
.addWhen
foi removido em favor de when
.updated_at
na maioria dos casos. Se você não usar carimbos de data/hora, agora usará a chave primária por padrão. startWithWildcard
foi renomeado para beginWithWildcard
.getUpdatedAtColumn
. Anteriormente, ele era codificado para updated_at
. Você ainda pode usar outra coluna para ordenar.allowEmptySearchQuery
e a classe EmptySearchQueryException
foram removidos, mas você ainda pode obter resultados sem pesquisar. Inicie sua consulta de pesquisa adicionando um ou mais modelos para pesquisar. Chame o método add
com o nome da classe do modelo e a coluna que você deseja pesquisar. Em seguida, chame o método search
com o termo de pesquisa e você obterá uma instância IlluminateDatabaseEloquentCollection
com os resultados.
Os resultados são classificados em ordem crescente pela coluna atualizada por padrão. Na maioria dos casos, esta coluna é updated_at
. Se você personalizou a constante UPDATED_AT
do seu modelo ou substituiu o método getUpdatedAtColumn
, este pacote usará a coluna personalizada. Se você não usar carimbos de data/hora, ele usará a chave primária por padrão. Claro, você também pode ordenar por outra coluna.
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Se você se preocupa com o recuo, você pode opcionalmente usar o new
método na fachada:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Há também um método when
para aplicar certas cláusulas com base em outra condição:
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
Por padrão, dividimos o termo de pesquisa e cada palavra-chave receberá um símbolo curinga para fazer correspondência parcial. Praticamente isso significa que o termo de pesquisa apple ios
resultará em apple%
e ios%
. Se você também quiser um símbolo curinga para começar, poderá chamar o método beginWithWildcard
. Isso resultará em %apple%
e %ios%
.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
Nota: nas versões anteriores deste pacote, este método era denominado startWithWildcard()
.
Se quiser desabilitar o comportamento em que um curinga é anexado aos termos, você deve chamar o método endWithWildcard
com false
:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
A pesquisa de várias palavras é suportada imediatamente. Simplesmente coloque sua frase entre aspas duplas.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
Você pode desativar a análise do termo de pesquisa chamando o método dontParseTerm
, que fornece os mesmos resultados que usar aspas duplas.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
Se quiser classificar os resultados por outra coluna, você pode passar essa coluna para o método add
como um terceiro parâmetro. Chame o método orderByDesc
para classificar os resultados em ordem decrescente.
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
Você pode chamar o método orderByRelevance
para classificar os resultados pelo número de ocorrências dos termos de pesquisa. Imagine estas duas frases:
Se você pesquisar Apple iPad , a segunda frase aparecerá primeiro, pois há mais correspondências dos termos de pesquisa.
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
A ordenação por relevância não será suportada se você estiver pesquisando por meio de relacionamentos (aninhados).
Para classificar os resultados por tipo de modelo, você pode usar o método orderByModel
, fornecendo sua ordem preferida dos modelos:
Search :: new ()
-> add ( Comment ::class, [ ' body ' ])
-> add ( Post ::class, [ ' title ' ])
-> add ( Video ::class, [ ' title ' , ' description ' ])
-> orderByModel ([
Post ::class, Video ::class, Comment ::class,
])
-> search ( ' Artisan School ' );
É altamente recomendável paginar seus resultados. Chame o método paginate
antes do método search
e você obterá uma instância de IlluminateContractsPaginationLengthAwarePaginator
como resultado. O método paginate
usa três parâmetros (opcionais) para personalizar o paginador. Esses argumentos são iguais aos do paginador de banco de dados do Laravel.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Você também pode usar paginação simples. Isso retornará uma instância de IlluminateContractsPaginationPaginator
, que não reconhece o comprimento:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Em vez do nome da classe, você também pode passar uma instância do construtor de consultas Eloquent para o método add
. Isso permite adicionar restrições a cada modelo.
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
Você pode pesquisar em várias colunas passando uma matriz de colunas como segundo argumento.
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
Você pode pesquisar relacionamentos (aninhados) usando a notação de ponto :
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
Você pode usar a pesquisa de texto completo do MySQL usando o método addFullText
. Você pode pesquisar em uma ou várias colunas (usando índices de texto completo) e pode especificar um conjunto de opções, por exemplo, para especificar o modo. Você pode até misturar pesquisas regulares e de texto completo em uma consulta:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
Se quiser pesquisar relacionamentos, você precisa passar um array onde a chave do array contém a relação, enquanto o valor é um array de colunas:
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
O MySQL possui um algoritmo soundex integrado para que você possa pesquisar termos que soam quase iguais. Você pode usar esse recurso chamando o método soundsLike
:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
Não há muito o que explicar aqui, mas isso também é suportado :)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
Você chama o método search
sem um termo ou com um termo vazio. Neste caso, você pode descartar o segundo argumento do método add
. Com o método orderBy
, você pode definir a coluna para classificar por (anteriormente o terceiro argumento):
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
Você pode contar o número de resultados com o método count
:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
Você pode usar includeModelType
para adicionar o tipo de modelo ao resultado da pesquisa.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> includeModelType ()
-> paginate ()
-> search ( ' foo ' );
// Example result with model identifier.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " Post " ,
},
{
"id": 1 ,
"title": "foo",
"subtitle": null ,
"published_at": null ,
"created_at": " 2021-12-03T09:39:10.000000Z " ,
" updated_at ": " 2021 - 12 - 03 T09 : 39 : 10.000000 Z ",
" type ": " Video ",
},
],
...
}
Por padrão, ele usa a chave type
, mas você pode personalizar isso passando a chave para o método.
Você também pode personalizar o valor type
adicionando um método público searchType()
ao seu modelo para substituir o nome base da classe padrão.
class Video extends Model
{
public function searchType ()
{
return ' awesome_video ' ;
}
}
// Example result with searchType() method.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " awesome_video " ,
}
],
...
Você pode usar o analisador com o método parseTerms
:
$ terms = Search :: parseTerms ( ' drums guitar ' );
Você também pode passar um retorno de chamada como segundo argumento para percorrer cada termo:
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
Consulte CHANGELOG para obter mais informações sobre o que mudou recentemente.
Consulte CONTRIBUINDO para obter detalhes.
Inertia Table
: a tabela definitiva para Inertia.js com Query Builder integrado.Laravel Blade On Demand
: pacote Laravel para compilar templates Blade na memória.Laravel Eloquent Scope as Select
: Pare de duplicar seus escopos e restrições de consulta Eloquent em PHP. Este pacote permite reutilizar escopos e restrições de consulta adicionando-os como uma subconsulta.Laravel FFMpeg
: Este pacote fornece integração com FFmpeg para Laravel. O armazenamento dos arquivos é feito pelo sistema de arquivos do Laravel.Laravel MinIO Testing Tools
: execute seus testes em um servidor MinIO S3.Laravel Mixins
: Uma coleção de guloseimas do Laravel.Laravel Paddle
: integração API Paddle.com para Laravel com suporte para webhooks/eventos.Laravel Task Runner
: Escreva scripts Shell como componentes Blade e execute-os localmente ou em um servidor remoto.Laravel Verify New Email
: Este pacote adiciona suporte para verificação de novos endereços de email: quando um usuário atualiza seu endereço de email, ele não substituirá o antigo até que o novo seja verificado.Laravel XSS Protection
: Laravel Middleware para proteger seu aplicativo contra scripts entre sites (XSS). Ele limpa a entrada de solicitação e pode limpar instruções de eco do Blade.Se você descobrir algum problema relacionado à segurança, envie um e-mail 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.
Este pacote é Treeware. Se você usar na produção, pedimos que compre uma árvore para o mundo para nos agradecer pelo nosso trabalho. Ao contribuir para a floresta Treeware, você criará empregos para as famílias locais e restaurará os habitats da vida selvagem.