Skip to content
Advertisement

Laravel Search Form with Filters

I want to implement a search form in Laravel, I was watched every video on YouTube to do this, and tried many tutorials but my code doesn’t work.


File web.php
In my routes are a resource with CRUD of clients, which will also have a search, which I want to implement filters, by name, by state, etc…

Route::resource('clients', 'ClientController');
Route::any('/search', 'ClientController@search')->name('search');

File ClientController.php
The function search is a tried to implement the search, but I know is totally wrong, but I don’t find on Google any clear tutorial I understood how to do correctly…

public function search(Request $request)
{
    $nome = $request->nome;
    $uf = $request->uf;
    $pesquisa = Client::where('nome', 'like', '%'.$nome.'%')
    ->orderBy('nome')
    ->paginate(5);

    return view('clients.index')
        ->with('pesquisa', $pesquisa)
        ->with('clients', $clients);
}

File index.blade.php
This is my page on Front-end… Has a table of all clients, and on top I want to implement a search with filters by name and by state…

@section('title', 'Clientes')

@section('content_header')
    <h1>
      Clientes
      &nbsp;&nbsp;
      <a href="{{ route('clients.create') }}" class="btn btn-sm btn-success">
        Novo Cliente
      </a>  
    </h1>  
@endsection

@section('content')
<div class="box">
  <div class="box-header">
    <nobr>
    <form action="/painel/search" method="POST" class="form form-inline" role="search">
      @csrf
      <div class="col-2">
        <input type="text" name="nome" class="form-control" placeholder="Nome">
        &nbsp;
        <input type="text" name="uf" class="form-control" placeholder="UF">
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <button type="submit" class="btn btn-primary">Pesquisar</button>
       </div>
    </form>
    </nobr>
  </div>
</div>

</br>

<div class="card">
    <div class="card-body">
        <table class="table table-hover">
            <thead>
                  <tr>
                      <th>Nome</th>
                      <th>UF</th>
                      <th>Telefone</th>
                      <th>
                        <nobr>Ações</nobr>
                      </th>
                  </tr>
                </thead>
            <tbody>
                  @foreach($clients as $client)
                    <tr>
                      <td>{{$client->nome}}</td>
                      <td>{{$client->uf}}</td>
                      <td>{{$client->telefone}}</td>
                      <td>
                        <nobr>
                          <a href="{{ route('clients.edit', ['client' => $client->id]) }}" class="btn btn-sm btn-info">Editar</a>

                          <form class="d-inline" method="POST" 
                              action="{{ route('clients.destroy', ['client' => $client->id]) }}" 
                              onsubmit="return confirm('Tem certeza que deseja excluir o cliente?')">
                              @method('DELETE')
                              @csrf
                              <button class="btn btn-sm btn-danger">Excluir</button>
                          </form>

                        </nobr>
                      </td>
                    </tr>        
                  @endforeach

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

{{ $clients->links() }}

@endsection

Advertisement

Answer

You don’t have the $clients variable defined in your controller, so it would not make sense to include it in the return. Also, seeing that in your view, you loop over that variable, I think that if you simply change the name of the variable where you save the result of your query from $pesquisa to $clients, everything will work:

public function search(Request $request)
{
    $nome = $request->nome;

    $clients = Client::where('nome', 'like', '%'.$nome.'%')
        ->orderBy('nome')
        ->paginate(5);

    return view('clients.index')
        ->with('clients', $clients);
}

Also, your form action it’s maybe wrong, try using the route name instead the uri:

<form action="{{ route('search') }}" //...
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement