Posted on: October 01, 2025 06:00 PM
Posted by: Renato
Categories: Laravel
Views: 54
Boa! Esse detalhe é realmente importante em Laravel quando trabalhamos com paginação e filtros. 🚀
O problema
Quando você faz uma consulta paginada com filtros vindos da URL (query string), como por exemplo:
/posts?category=php&author=renato
Se você usa apenas:
$posts = Post::paginate(10);
O Laravel gera os links de paginação assim:
/posts?page=2
👉 Repare que os filtros (category, author) se perdem.
Isso significa que ao clicar na próxima página, os resultados não estarão mais filtrados.
A solução
Ao adicionar o método withQueryString():
$posts = Post::query()->where('category', 'php')->where('author', 'renato')->paginate(10)->withQueryString();
Agora os links de paginação serão gerados assim:
/posts?category=php&author=renato&page=2
✅ Ou seja, os filtros permanecem enquanto você navega entre as páginas.
Diferença para appends()
O Laravel também tem o método appends(), que faz algo semelhante, mas você precisa passar manualmente os parâmetros:
$posts->appends(request()->query());
Enquanto withQueryString() já usa a query string atual automaticamente.
Quando usar
-
Sempre que você tiver filtros via GET (buscas, categorias, ordenação).
-
Para garantir consistência na experiência do usuário.
-
Para evitar bugs sutis em produção, onde o usuário pensa que está navegando em uma lista filtrada mas perde os filtros ao mudar de página.
👉 Resumindo:
-
paginate()sozinho não preserva filtros. -
paginate()->withQueryString()mantém todos os filtros da URL ativos. -
É essencial em listas filtráveis e paginadas.
$modeller->withQueryString()->paginate(18);
https://x.com/epmadushanka/status/1971082486022307965
Donate to Site
Renato
Developer