---
title: "Crear un búscador con Laravel y spatie/laravel-searchable."
excerpt: "Si, hay muchos tutoriales en internet sobre esto pero esta vez será algo rápido de implementar ;)"
date: "2020-03-19T18:08:14.000Z"
category: "Laravel"
seo_title: "Crear un buscador en Laravel con spatie/laravel-searchable"
seo_description: "Implementa un buscador en Laravel sin Algolia usando el paquete spatie/laravel-searchable. Configura la interfaz Searchable en tu modelo y crea un endpoint de búsqueda en minutos."
author:
  name: "angel cruz"
  picture: "https://angelcruzdevcdn.nyc3.cdn.digitaloceanspaces.com/images/me/angel-cruz.png"
ogImage:
  url: "/images/open-graph/laravel-opengraph-image.png"
---

Ok, recientemente he estado trabajando en una aplicación que llegó a un punto que necesitaba un buscador.

Claro, existen cosas como [Laravel Scout](https://laravel.com/docs/master/scout) pero por ser un MVP el proyecto no cuenta con un budget que permita invertir en algolia.

Entonces, buscando siempre en los paquetes creados por la comunidad resaltan los de [spatie](https://spatie.be/open-source/packages), sus paquetes me han ayudado a resolver problemas de una forma mucho más rápida y eficiente.

El paquete que necesite para esto es:

```shell
composer require spatie/laravel-searchable
```

La configuración de este paquete es sencilla, solo requiere que implementemos la interfaz `Searchable` en el modelo a usar, de la siguiente forma:


```php
<?php

namespace App\Models;

use Spatie\Searchable\Searchable;
use Spatie\Searchable\SearchResult;
use Illuminate\Database\Eloquent\Model;

class Post extends Model implements Searchable
{
    // other stuff

    public function getSearchResult(): SearchResult
    {
        return new SearchResult(
            $this,
            $this->title,
            route('front.post.show', $this->slug)
        );
    }
}

```

Aquí básicamente lo que estamos haciendo es crear una nueva instancia de `SearchResult` dónde le pasamos como parámetros: el modelo en sí mismo, el título y la url del recurso.


Ahora creamos un controlador para poder tener acceso a la data desde nuestro frontend usando (por ejemplo) VueJS / ReactJS, Axios o Ajax. En mi caso, usé un [Single Action Controller](https://laravel.com/docs/5.7/controllers#single-action-controllers) de la siguiente forma:


```php
<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Spatie\Searchable\Search;
use App\Http\Controllers\Controller;

class ShowProfile extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        $response = (new Search())
            ->registerModel(Post::class, ['title'])
            ->search($request->search);

        return response()->json($response);
    }
}
```

Ya lo único que queda es crear una ruta:


```php
Route::get('/search', 'Front\Search\SearchController')
   ->name('front.search');
```

NOTA: este post es básicamente una traducción del readme del paquete `spatie/laravel-searchable`. Para más info, vayan al [repo](https://github.com/spatie/laravel-searchable).

---

## Sitemap

Índice completo del sitio: [/sitemap.md](https://angelcruz.dev/sitemap.md)

Canónico HTML: [https://angelcruz.dev/post/crear-un-buscador-con-laravel-y-spatielaravel-searchable](https://angelcruz.dev/post/crear-un-buscador-con-laravel-y-spatielaravel-searchable)
