Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Preencher Tabela baseado na rota da categoria (Laravel)

Seguinte, eu tenho uma tabela que lista todos os produtos, mas eu queria fazer com que o usuário possa filtrar esses produtos por categoria, afiliacao ou até mesmo status. Pra isso, eu criei menus interativos em que o usuário pode filtrar esses produtos.

Essa é a tabela: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como eu poderia fazer o preenchimento dessa tabela de forma dinâmica com a rota dinâmica?

Esses são os filtros: Insira aqui a descrição dessa imagem para ajudar na acessibilidade A título de curiosidade, a caso o usuário queria filtrar pela categoria Tapetes, a rota teria que ser mais ou menos /produtos/categoria/tapetes, a mesma lógica valeria para status e afiliação:

Afiliação: /produtos/amazon Status: /produtos/status/publicados

2 respostas
solução!

Olá, Elisame! Parece que você está no caminho certo com a ideia de rotas dinâmicas. No Laravel, você pode definir parâmetros em suas rotas para lidar com isso.

Primeiro, você precisa definir rotas que aceitam esses parâmetros em seu arquivo web.php (ou api.php se estiver criando uma API). Por exemplo:

Route::get('/produtos/categoria/{categoria}', 'ProdutoController@filtrarPorCategoria');
Route::get('/produtos/{afiliacao}', 'ProdutoController@filtrarPorAfiliacao');
Route::get('/produtos/status/{status}', 'ProdutoController@filtrarPorStatus');

Em seguida, em seu ProdutoController, você pode ter métodos que aceitam esses parâmetros e filtram os produtos de acordo. Por exemplo:

public function filtrarPorCategoria($categoria)
{
    $produtos = Produto::where('categoria', $categoria)->get();
    return view('produtos.index', ['produtos' => $produtos]);
}

public function filtrarPorAfiliacao($afiliacao)
{
    $produtos = Produto::where('afiliacao', $afiliacao)->get();
    return view('produtos.index', ['produtos' => $produtos]);
}

public function filtrarPorStatus($status)
{
    $produtos = Produto::where('status', $status)->get();
    return view('produtos.index', ['produtos' => $produtos]);
}

Esses métodos irão buscar todos os produtos que correspondem ao parâmetro fornecido (categoria, afiliação ou status) e, em seguida, retornarão a mesma view de index de produtos, mas com os produtos filtrados.

Lembre-se de substituir 'categoria', 'afiliacao' e 'status' pelas colunas correspondentes em seu banco de dados. Além disso, certifique-se de que os valores de categoria, afiliação e status na URL estejam no mesmo formato que os valores no banco de dados.

Espero ter ajudado e bons estudos!

Funcionou perfeitamente! Fiz algumas adaptações para o uso na filtragem de status de comentários e assim ficou:

public function filtrarPorStatusAprovado($aprovados)
    {
        $comentarios = Comentarios::where('statusComentario', $aprovados)->paginate(10);
        return view('blog.comentarios', ['comentarios' => $comentarios]);
    }

    public function filtrarPorStatusRecusado($recusados)
    {
        $comentarios = Comentarios::where('statusComentario', $recusados)->paginate(10);
        return view('blog.comentarios', ['comentarios' => $comentarios]);
    }

    public function filtrarPorStatusRevisao($revisao)
    {
        $comentarios = Comentarios::where('statusComentario', $revisao)->paginate(10);
        return view('blog.comentarios', ['comentarios' => $comentarios]);
    }

Como eu já uso a variável $comentarios para fazer um foreach de todos os comentarios, eu aproveitei ela, e ele filtrou lindamente todos os resultados baseado na rota, que ficou assim:

Route::get('/comentarios/status/{aprovados}', [FiltroComentariosController::class, 'filtrarPorStatusAprovado'])->name('aprovados');
Route::get('/comentarios/status/{recusados}', [FiltroComentariosController::class, 'filtrarPorStatusRecusado'])->name('recusados');
Route::get('/comentarios/status/{revisao}', [FiltroComentariosController::class, 'filtrarPorStatusRevisao'])->name('revisao');

E na minha página de comentários, a filtragem ficou:

<div class="dropdown-menu">
       <a class="dropdown-item text-primary" href="{{route('comentarios')}}"><i class="fa-solid fa-list-ol"></i> Todos</a>
       <a class="dropdown-item text-success" href="{{route('aprovados', 1)}}"><i class="fa-regular fa-circle-check"></i> Aprovados</a>
       <a class="dropdown-item text-danger" href="{{route('recusados', 2)}}"><i class="fa-solid fa-ban"></i> Recusados</a>
       <a class="dropdown-item text-secondary" href="{{route('revisao', 3)}}"><i class="fa-solid fa-asterisk"></i> Precisa de Revisão</a>
 </div>

Espero que ajude também quem tem dúvidas de como fazer esse tipo de coisa!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software