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...