Filtros de búsqueda en Laravel-Livewire

juliodotcom

JulioDotCom

Posted on August 4, 2021

Filtros de búsqueda en Laravel-Livewire

Una de las principales características que el usuario requiere cuando trabajamos con tablas es el filtrado de información en tiempo real.
En este post te enseñaré a crear diferentes filtros de búsqueda con el dinamismo que nos provee Laravel-Livewire.

Instalación.

No nos detendremos a explicar la instalación de este framework es de lo mas sencillo; basta con seguir al pie de la letra la documentación oficial.

Universo del discurso.

Se tiene una pequeña app de películas que fueron dirigidas por uno o más directores de cine, lo que buscamos es mostrar la información de cada uno de las películas así como la de los directores de cine con filtros de búsqueda.
Para las películas los filtros necesarios son: Nombre de película y fecha de estreno.
Para los directores de cine los filtros necesarios son: Nombre del director.

Manos a la obra.

Una vez entendido la situación a resolver empecemos a codificar.
Comenzaremos creando la estructura de la base de datos que podría lucir como la siguiente.



movies
    id - integer
    title- string 
    premiere - date

directors
    id - integer
    name - string

director_movie
    id - integer
    director_id - integer    
    movie_id - integer


Enter fullscreen mode Exit fullscreen mode

Después crearemos modelos para cada entidad y agregaremos nuestras relaciones.
Modelo Director.



<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Director extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
    ];
    /*
    * Relationships
    **/
    public function movies(){
        return $this->belongsToMany(Movie::class);
    }
}


Enter fullscreen mode Exit fullscreen mode

Modelo Película



<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Movie extends Model
{
    use HasFactory;

    protected $fillable = [
        'title',
        'premiere'
    ];
    /*
    * Relationships
    **/

    public function directors(){
        $this->belongsToMany(Director::class);
    }
}


Enter fullscreen mode Exit fullscreen mode

Nota: Para hacer el seed de mi base de datos estoy usando faker, posiblemente tú tengas información real así que no te preocupes por ello.

Ya que modelamos nuestra base de datos podremos crear nuestro componente usando el CLI de Artisan.



php artisan make:component IndexComponent


Enter fullscreen mode Exit fullscreen mode

Deberá aparecer este nuevo componente en nuestra carpeta

App\Http\Livewire\IndexComponent.php

Dentro del componente encontraremos el método render que mostrará el template de nuestro componente.



<?php

namespace App\Http\Livewire;

use Livewire\Component;

class IndexComponent extends Component
{
    public function render()
    {
        return view('livewire.index-component');
    }
}


Enter fullscreen mode Exit fullscreen mode

En esta vista es donde crearemos nuestra tabla para mostrar la información.




<div>
    <div class="table-responsive">
        <table class="table">
            <thead>
            <th>Nombre de película</th>
            <th>Premiere</th>
            <th>Director</th>
            </thead>
            <tbody>

            </tbody>
        </table>
    </div>
</div>


Enter fullscreen mode Exit fullscreen mode

Nota: Es imperativo contar con un div padre para todo componente de lo contrario encontraremos errores.

Antes de continuar tengo que platicarte que Livewire nos brinda una API de acceso a propiedades dinámicas, especialmente para obtener información que se encuentra almacenada en una base de datos, esto se resume en las Computed Properties.

Para crear una computed property es necesario crear un método que nos de acceso a ella y para lograrlo utilizaremos la siguiente nomenclatura



Utilizando el sufijo get[nuestra_propiedad]Property
public function getMoviesProperty(){
    // some magic code
}


Enter fullscreen mode Exit fullscreen mode

siguiendo esta convención estamos listos para pasar a la parte importante de nuestro código.

Bien, hasta ahora nuestro controlador del componente luce de esta forma.



<?php

namespace App\Http\Livewire;

use Livewire\Component;

class IndexComponent extends Component
{

    public function getMoviesProperty(){
        //Some magic code.
    }


    public function render()
    {
        return view('livewire.index-component');
    }
}


Enter fullscreen mode Exit fullscreen mode

Es necesario crear nuestros filtros para realizar la búsqueda, en lo personal a mi me gusta abstraerlos en un array asociativo, déjame mostrarte como:



<?php

namespace App\Http\Livewire;

use Livewire\Component;

class IndexComponent extends Component
{

    public $filters = [
        'movie_title' => '',
        'premiere' => '',
        'director_name' => '',
    ];
...


Enter fullscreen mode Exit fullscreen mode

De está manera abstraemos todos los filtros en un solo array para realizar el binding de nuestro array de filtros para esto también es necesario agregar los inputs en nuestro template.

image

Ahora a mostrar los datos del controlador del componente usando nuestra computed property

image

Permíteme explicarte línea por línea la idea del primer filtro que estamos haciendo.

  • Indicamos que se hará un query al modelo Movie.
  • Haciendo uso de las clausulas condicionales del query builder de Laravel el modelo entenderá cuando será necesario retornar alguna otra sentencia, es decir, cuando no se encuentre vacío el valor del índice movie_title retornará la sentencia where que se encuentra dentro de la función anónima del método when; de lo contrario saltará a la siguiente instrucción.
  • Agregamos el método with para evitar hacer demasiadas peticiones al servidor en las relaciones.

Ya que entendimos el flujo de información entre la vista del componente y el controlador del componente podremos realizar los demás filtros.

image
Ahora bien; permíteme explicarte el funcionamiento del ultimo filtro que contiene la relación M:N de nuestra base de datos.

  • Cuando no se encuentre vacío el valor del índice director_name retornara lo que se tenga dentro de la función anónima del método, así mismo haremos una unión entre las tablas con el método whereHas de esta manera podremos filtrar de manera correcta el nombre del director.

Mostrando los datos

Finalmente solo queda mostrar los datos en la vista del componente de la siguiente manera.

image

Es tu turno.

Hasta aquí hemos terminado el tutorial de como realizar los filtros de información en tiempo real, solo queda probarlo en tu maquina local y verás la magia.
Happy codding!

💖 💪 🙅 🚩
juliodotcom
JulioDotCom

Posted on August 4, 2021

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related