En un blog es importante que haya un buscador, para facilitar a nuestros visitantes que encuentren contenido que sea de su interés. Hoy lo añadiremos al blog que estamos desarrollando. Veremos como añadir dos tipos de buscadores, uno simple y otro full-text search.
Búscador simple
Primero añadiremos el formulario de búsqueda a la vista. Abrimos el archivo resources/views/posts.blade.php y añadimos el siguiente código:
1 2 3 4 5 6 |
... {{ Form::open(['route' => ['posts.index'], 'method' => 'GET']) }} <p>{{ Form::text('search', old('search'), array('placeholder'=>'Search')) }}</p> <p>{{ Form::submit('Search') }}</p> {{ Form::close() }} ... |
El formulario se envía a la ruta llamada posts.index (que ahora le añadiremos el nombre porque actualmente no lo tiene) a través del método HTTP GET.
Modificar en el archivo de rutas la ruta index para añadir el nombre:
1 |
Route::get('/posts', 'PostsController@index')->name('posts.index'); |
Abrimos el controlador y modificamos el método index:
1 2 3 4 5 6 7 |
public function index() { $posts = Post::where('title', 'like', '%'.Input::get('search').'%') ->orWhere('body', 'like', '%'.Input::get('search').'%') ->orderBy('id', 'desc')->paginate(6); return view('posts', ['posts' => $posts]); } |
Lo que hace es devolver los posts que contengan, o en el title o en el body, lo que hayamos puesto en el buscador.
Buscador full-text
Este tipo de búsqueda es más rápida que la anterior, ya que se basa en índices.
Para añadir este tipo de buscador, vamos a instalar un paquete de Laravel llamado Eloquence.
1 |
composer require sofa/eloquence |
Una vez haya acabado la instalación, deberemos registrar el paquete. Abrimos el config/app.php y añadimos esta línea al array de $providers:
1 2 3 4 |
'providers' => [ ... 'Sofa\Eloquence\ServiceProvider', ], |
Abrimos el modelo y añadimos estas líneas (añadir Eloquence para poder utilizarlo después y añadir las columnas por las que se buscará por defecto):
1 2 3 4 5 6 7 8 9 10 11 12 |
... use Sofa\Eloquence\Eloquence; class Post extends Model { ... use Eloquence; // default fields to search protected $searchableColumns = ['title', 'body']; ... } |
Abrimos el controlador y modificamos el método index:
1 2 3 4 5 |
public function index() { $posts = Post::search(Input::get('search'))->orderBy('id', 'desc')->paginate(6); return view('posts', ['posts' => $posts]); } |
Utilizamos el método search del paquete Eloquence, pasándole el valor de la búsqueda.
Para encontrar más información sobre este paquete, la puedes encontrar en su documentación.
-
– https://packagist.org/packages/sofa/eloquence
– https://github.com/jarektkaczyk/eloquence/wiki/Builder-searchable-and-more