Este paquete facilita la búsqueda estructurada de una variedad de fuentes. A continuación se muestra un ejemplo en el que buscamos entre algunos modelos. Ya hicimos una pequeña preparación en los propios modelos.
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
La búsqueda se realizará sin distinguir entre mayúsculas y minúsculas. $searchResults
ahora contiene todos los modelos User
que contienen john
en el atributo name
y BlogPost
que contienen 'john' en el atributo title
.
En su vista, ahora puede recorrer los resultados de la búsqueda:
< 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
En este ejemplo utilizamos modelos, pero puedes agregar fácilmente un aspecto de búsqueda para una API externa, una lista de archivos o una matriz de valores.
Invertimos muchos recursos en la creación de los mejores paquetes de código abierto. Puedes apoyarnos comprando uno de nuestros productos pagos.
Agradecemos mucho que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando. Encontrarás nuestra dirección en nuestra página de contacto. Publicamos todas las postales recibidas en nuestro muro virtual de postales.
Puede instalar el paquete a través del compositor:
composer require spatie/laravel-searchable
Para buscar modelos, deberá permitirles implementar la interfaz Searchable
.
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
Solo necesitará agregar un método getSearchResult
a cada modelo con capacidad de búsqueda que deba devolver una instancia de SearchResult
. Así es como podría verse para un modelo de publicación 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
);
}
}
Con los modelos preparados puedes buscarlos así:
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
La búsqueda se realizará sin distinguir entre mayúsculas y minúsculas. $searchResults
ahora contiene todos los modelos User
que contienen john
en el atributo name
.
También puede pasar varios atributos para buscar:
// 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 obtener un control detallado también puede utilizar un invocable. De esta manera, también puede buscar coincidencias exactas, aplicar alcances, relaciones de carga entusiastas o incluso filtrar su consulta como lo haría con el generador 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 ' );
});
No está limitado a registrar únicamente modelos básicos como aspectos de búsqueda. Puede crear fácilmente sus propios aspectos de búsqueda personalizados ampliando la clase SearchAspect
.
Considere el siguiente aspecto de búsqueda personalizada para buscar una API externa:
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
Así es como puedes usarlo:
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
Es posible limitar la cantidad de resultados devueltos por cada aspecto llamando limitAspectResults
antes de realizar la búsqueda.
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
Aquí hay un ejemplo sobre cómo representar resultados de búsqueda:
< 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
Puede personalizar el $type
agregando una propiedad pública $searchableType
en su modelo o aspecto de búsqueda personalizado.
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
Consulte CONTRIBUCIÓN para obtener más detalles.
Si ha encontrado un error 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.