Este paquete de Laravel le permite buscar en múltiples modelos de Eloquent. Admite clasificación, paginación, consultas de alcance, relaciones de carga entusiastas y búsqueda en una o varias columnas.
❤️ Estamos orgullosos de apoyar a la comunidad desarrollando paquetes de Laravel y regalándolos de forma gratuita. Si este paquete le ahorra tiempo o si confía en él profesionalmente, considere patrocinar el mantenimiento y el desarrollo y consulte nuestro último paquete premium: Inertia Table. Realizar un seguimiento de los problemas y las solicitudes de extracción lleva tiempo, ¡pero estaremos encantados de ayudarle!
Si desea obtener más información sobre los antecedentes de este paquete, lea la publicación del blog.
Puede instalar el paquete a través del compositor:
composer require protonemedia/laravel-cross-eloquent-search
get
ha sido renombrado a search
.addWhen
se eliminó en favor de when
.updated_at
en la mayoría de los casos. Si no usa marcas de tiempo, ahora usará la clave principal de forma predeterminada. startWithWildcard
a beginWithWildcard
.getUpdatedAtColumn
. Anteriormente estaba codificado en updated_at
. Aún puedes usar otra columna para ordenar.allowEmptySearchQuery
y la clase EmptySearchQueryException
, pero aún puede obtener resultados sin realizar búsquedas. Comience su consulta de búsqueda agregando uno o más modelos para buscar. Llame al método add
con el nombre de la clase del modelo y la columna en la que desea buscar. Luego llame al método search
con el término de búsqueda y obtendrá una instancia IlluminateDatabaseEloquentCollection
con los resultados.
Los resultados se ordenan en orden ascendente según la columna actualizada de forma predeterminada. En la mayoría de los casos, esta columna es updated_at
. Si personalizó la constante UPDATED_AT
de su modelo o sobrescribió el método getUpdatedAtColumn
, este paquete utilizará la columna personalizada. Si no utiliza ninguna marca de tiempo, utilizará la clave principal de forma predeterminada. Por supuesto, también puedes ordenar por otra columna.
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Si le importa la sangría, opcionalmente puede utilizar el new
método en la fachada:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
También existe un método when
para aplicar ciertas cláusulas basadas en otra condición:
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
De forma predeterminada, dividimos el término de búsqueda y cada palabra clave obtendrá un símbolo comodín para realizar una coincidencia parcial. En la práctica, esto significa que el término de búsqueda apple ios
dará como resultado apple%
y ios%
. Si también desea comenzar con un símbolo comodín, puede llamar al método beginWithWildcard
. Esto dará como resultado %apple%
y %ios%
.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
Nota: en versiones anteriores de este paquete, este método se llamaba startWithWildcard()
.
Si desea deshabilitar el comportamiento en el que se agrega un comodín a los términos, debe llamar al método endWithWildcard
con false
:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
La búsqueda de varias palabras se admite desde el primer momento. Simplemente envuelva su frase entre comillas dobles.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
Puede desactivar el análisis del término de búsqueda llamando al método dontParseTerm
, que le proporciona los mismos resultados que si utiliza comillas dobles.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
Si desea ordenar los resultados por otra columna, puede pasar esa columna al método add
como tercer parámetro. Llame al método orderByDesc
para ordenar los resultados en orden descendente.
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
Puede llamar al método orderByRelevance
para ordenar los resultados por el número de apariciones de los términos de búsqueda. Imagínate estas dos frases:
Si busca Apple iPad , la segunda frase aparecerá primero, ya que hay más coincidencias de los términos de búsqueda.
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
No se admite el orden por relevancia si busca entre relaciones (anidadas).
Para ordenar los resultados por tipo de modelo, puede utilizar el método orderByModel
dándole su orden preferido de los 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 ' );
Recomendamos encarecidamente paginar sus resultados. Llame al método paginate
antes del método search
y obtendrá como resultado una instancia de IlluminateContractsPaginationLengthAwarePaginator
. El método paginate
toma tres parámetros (opcionales) para personalizar el paginador. Estos argumentos son los mismos que los del paginador de bases de datos de Laravel.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
También puede utilizar paginación simple. Esto devolverá una instancia de IlluminateContractsPaginationPaginator
, que no tiene en cuenta la longitud:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
En lugar del nombre de la clase, también puedes pasar una instancia del generador de consultas Eloquent al método add
. Esto le permite agregar restricciones a cada modelo.
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
Puede buscar en varias columnas pasando una matriz de columnas como segundo argumento.
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
Puede buscar relaciones (anidadas) utilizando la notación de puntos :
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
Puede utilizar la búsqueda de texto completo de MySQL utilizando el método addFullText
. Puede buscar en una o varias columnas (utilizando índices de texto completo) y puede especificar un conjunto de opciones, por ejemplo, para especificar el modo. Incluso puedes combinar búsquedas regulares y de texto completo en una sola consulta:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
Si desea buscar relaciones, debe pasar una matriz donde la clave de la matriz contenga la relación, mientras que el valor sea una matriz de columnas:
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
MySQL tiene un algoritmo Soundex incorporado para que pueda buscar términos que suenen casi igual. Puede utilizar esta función llamando al método soundsLike
:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
No hay mucho que explicar aquí, pero esto también es compatible :)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
Llama al método search
sin término o con un término vacío. En este caso, puedes descartar el segundo argumento del método add
. Con el método orderBy
, puede configurar la columna para ordenar (anteriormente el tercer argumento):
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
Puede contar el número de resultados con el método count
:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
Puede utilizar includeModelType
para agregar el tipo de modelo al resultado de la búsqueda.
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 ",
},
],
...
}
De forma predeterminada, utiliza la clave type
, pero puede personalizarla pasando la clave al método.
También puede personalizar el valor type
agregando un método público searchType()
a su modelo para anular el nombre base de clase predeterminado.
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 " ,
}
],
...
Puede utilizar el analizador con el método parseTerms
:
$ terms = Search :: parseTerms ( ' drums guitar ' );
También puede pasar una devolución de llamada como segundo argumento para recorrer cada término:
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
Consulte CONTRIBUCIÓN para obtener más detalles.
Inertia Table
: la tabla definitiva para Inertia.js con Query Builder integrado.Laravel Blade On Demand
: Paquete Laravel para compilar plantillas Blade en memoria.Laravel Eloquent Scope as Select
: deje de duplicar los alcances y restricciones de sus consultas de Eloquent en PHP. Este paquete le permite reutilizar los alcances y restricciones de su consulta agregándolos como una subconsulta.Laravel FFMpeg
: este paquete proporciona una integración con FFmpeg para Laravel. El almacenamiento de los archivos está a cargo del sistema de archivos de Laravel.Laravel MinIO Testing Tools
: ejecute sus pruebas en un servidor MinIO S3.Laravel Mixins
: una colección de delicias de Laravel.Laravel Paddle
: integración de la API de Paddle.com para Laravel con soporte para webhooks/eventos.Laravel Task Runner
: escriba scripts de Shell como Blade Components y ejecútelos localmente o en un servidor remoto.Laravel Verify New Email
: este paquete agrega soporte para verificar nuevas direcciones de correo electrónico: cuando un usuario actualiza su dirección de correo electrónico, no reemplazará la anterior hasta que se verifique la nueva.Laravel XSS Protection
: Laravel Middleware para proteger su aplicación contra secuencias de comandos entre sitios (XSS). Limpia la entrada de solicitudes y puede limpiar las declaraciones de eco de Blade.Si descubre algún problema relacionado con la seguridad, envíe un correo electrónico a [email protected] en lugar de utilizar el rastreador de problemas.
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.
Este paquete es Treeware. Si lo utilizas en producción, te pedimos que le compres al mundo un árbol para agradecernos nuestro trabajo. Al contribuir al bosque Treeware, creará empleo para las familias locales y restaurará los hábitats de la vida silvestre.