Laravel 6 - 22 filtros de búsqueda

Laravel Logo

Hola y bienvenido.

En esta clase vamos a tratar varias formas de realizar filtros de búsqueda.

Lo primero es agregar a nuestra vista index.blade.php lo siguiente:

<nav class="navbar navbar-light float-right">
  <form class="form-inline">

    <input name="buscarpor" class="form-control mr-sm-2" type="search" placeholder="Buscar por nombre" aria-label="Search">

       <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Buscar</button>
  </form>
</nav>

y en el controlador AgendaController modificamos la funcion index y debe quedar de esta manera:

  public function index(Request $request)
    {

        $nombre = $request->get('buscarpor');

        $Agenda = Agenda::where('nombres','like',"%$nombre%")->paginate(5);
        
        return view('agenda.index', compact('Agenda'));
    }

Ahora bien, si probamos, veremos que ya está funcionando correctamente nuestro filtro por el campo nombres de nuestra tabla.

Pero que pasa, si nuestro cliente, nos dice: ahora quiero otro campo para poder buscar.

Quiero un campo nombre y otro apellido para buscar.

De esta manera la cosa se complica, y gracias a Dios, Laravel tiene unas funciones llamada Scope que nos ayudan bastante con este tema de filtros.

Ya en nuestro caso, tendremos que modificar la vista index de esta manera:

<nav class="navbar navbar-light float-right">
  <form class="form-inline">

    <input name="buscarpor" class="form-control mr-sm-2" type="search" placeholder="Buscar por nombre" aria-label="Search">

    <input name="buscarporapellido" class="form-control mr-sm-2" type="search" placeholder="Buscar por apellido" aria-label="Search">
    
    <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Buscar</button>
  </form>
</nav>

Debemos modificar nuestra función index del controlador.

public function index(Request $request)
    {

        $nombre = $request->get('buscarpor');
        
        $apellido = $request->get('buscarporapellido');

        $Agenda = Agenda::nombres($nombre)->apellidos($apellido)->paginate(5);
        
        return view('agenda.index', compact('Agenda'));
    }

Ahora debemos ir a nuestro modelo Agenda y agregar lo siguiente:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Agenda extends Model
{
    public function scopeNombres($query, $nombres) {
    	if ($nombres) {
    		return $query->where('nombres','like',"%$nombres%");
    	}
    }



    public function scopeApellidos($query, $apellidos) {
    	if ($apellidos) {
    		return $query->where('apellidos','like',"%$apellidos%");
    	}
    }
}

Si se fijan estamos diciendo que en modelo tenemos unas funciones con la palabra scope primero y luego un nombre con la primera letra mayúscula.

La primera funcion es scopeNombres y la segunda scropeApellidos.

y en nuestro controlador estamos llamando estas funciones solo escribiendo nombres y luego apellidos.

De esta manera, ya podemos buscar por ambos campos.

Por último, vamos a ver una forma que me gusta mas para trabajar estos criterios de búsqueda:

Vamos a modificar la vista index:

<nav class="navbar navbar-light float-right">
  <form class="form-inline">

    <select name="tipo" class="form-control mr-sm-2" id="exampleFormControlSelect1">
      <option>Buscar por tipo</option>
      <option>nombres</option>
      <option>apellidos</option>
      <option>telefono</option>
      <option>celular</option>
      <option>email</option>
    </select>


    <input name="buscarpor" class="form-control mr-sm-2" type="search" placeholder="Buscar por nombre" aria-label="Search">


    
    <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Buscar</button>
  </form>
</nav>

Vamos a modificar nuestra funcion index en nuestro controlador:

public function index(Request $request)
    {

        $buscar = $request->get('buscarpor');

        $tipo = $request->get('tipo');

        $Agenda = Agenda::buscarpor($tipo, $buscar)->paginate(5);
        
        return view('agenda.index', compact('Agenda'));
    }

y en nuestro modelo lo hacemos de esta manera:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Agenda extends Model
{
      public function scopeBuscarpor($query, $tipo, $buscar) {
    	if ( ($tipo) && ($buscar) ) {
    		return $query->where($tipo,'like',"%$buscar%");
    	}
    }
}

Espero que les haya gustado. 

Así que sin massssss nos veremos en la próxima...

Etiquetas
Video

Comparte este artículo