Video thumbnail

    Escopos de Consulta Avançados - Laravel na Prática EP2

    Valuable insights

    1.Problemas com Consultas Repetitivas: Consultas idênticas em múltiplos locais da aplicação criam dificuldades de manutenção. Alterações exigem atualizações em diversas partes, tornando o código propenso a erros e ineficiente.

    2.Introdução aos Query Scopes: Query scopes no Laravel permitem encapsular lógicas de consulta repetitivas em métodos reutilizáveis. Isso torna o código mais limpo, legível e fácil de manter em toda a aplicação.

    3.Nova Sintaxe `@scope` no Laravel 12: O Laravel 12 introduz o atributo `@scope`, simplificando a definição e o uso de scopes locais. Métodos marcados com este atributo tornam-se diretamente chamáveis em consultas Eloquent, melhorando a expressividade.

    4.Consultas Expressivas e Orientadas a Negócios: Utilizar scopes transforma consultas complexas em declarações que se assemelham a requisitos de negócio. Isso melhora drasticamente a clareza do código nos controllers, facilitando a compreensão.

    5.Scopes Parametrizados para Flexibilidade: Query scopes podem aceitar parâmetros, como um valor mínimo para popularidade. Isso aumenta a flexibilidade, permitindo consultas personalizadas sem duplicar lógica ou criar métodos excessivos.

    6.Combinação de Scopes e Coleções Customizadas: Scopes funcionam perfeitamente com coleções customizadas do Laravel. É possível encadear filtros de consulta e métodos de análise, resultando em relatórios poderosos e elegantes de forma concisa.

    7.Reutilização e Manutenibilidade Aprimoradas: A adoção de query scopes elimina a duplicação de código, garante consistência nas consultas e facilita atualizações futuras. Consultas repetitivas se transformam em código expressivo e reutilizável.

    Introdução e Recapitulação

    No episódio anterior, desenvolvemos um sistema de coleta de dados limpo, incluindo um resumo de negócios e o cálculo de pedidos médios por cliente. Embora tenhamos funcionalidades adicionais para coleções de pedidos, a filtragem de consultas ainda é uma área a ser aprimorada. Hoje, focaremos na implementação de query scopes para tornar nossas consultas mais legíveis e eficientes, abordando a necessidade de filtragem de dados de forma organizada e reutilizável em toda a aplicação.

    O Problema com Consultas Repetitivas

    Atualmente, nosso sistema de pedidos funciona bem, mas enfrentamos um desafio comum: a repetição de lógicas de consulta em diferentes partes da aplicação. Por exemplo, ao precisar dos pedidos concluídos criados a partir do início do mês, a mesma consulta pode aparecer em múltiplos controllers, como em um relatório. Se a necessidade de negócio mudar, como alterar o status de 'concluído' para 'pendente', seria necessário modificar essa lógica em todos os locais onde ela foi aplicada. Essa duplicação torna a manutenção complexa e aumenta o risco de inconsistências, um problema que os query scopes vieram resolver.

    Introduzindo Query Scopes

    Query scopes são a solução elegante para o problema da repetição de consultas. Eles permitem que você encapsule lógicas de filtragem comuns em métodos que podem ser reutilizados facilmente em todo o seu código. Ao invés de reescrever as mesmas cláusulas `WHERE` ou condições complexas várias vezes, você pode defini-las uma vez e chamá-las de forma limpa. Isso não apenas economiza tempo, mas também melhora significativamente a organização e a legibilidade do seu código.

    Implementando Query Scopes

    Vamos aprimorar o modelo `Order` do episódio anterior, utilizando a nova sintaxe de query scopes introduzida no Laravel 12. O objetivo é criar métodos que possam ser aplicados diretamente às consultas Eloquent para filtrar dados com base em critérios específicos, como status e período de criação.

    Escopo para Pedidos Concluídos

    Primeiro, criaremos um escopo para buscar todos os pedidos marcados como concluídos. Dentro do modelo `Order`, definimos uma função protegida chamada `completed`. Esta função recebe o builder Eloquent como argumento e adiciona uma condição `WHERE` para o campo `status` igual a 'completed'. Ao marcar este método com o atributo `@scope`, ele se torna um escopo local consultável.

    Escopo para Pedidos Deste Mês

    Em seguida, implementaremos um escopo para filtrar pedidos criados a partir do início do mês corrente. Chamaremos esta função protegida de `thisMonth`, passando também o builder. Aqui, aplicamos uma condição `WHERE` no campo `created_at`, garantindo que ele seja maior ou igual ao primeiro dia do mês atual. Assim como o escopo anterior, ele também é marcado com `@scope`.

    Testando e Usando Query Scopes

    Com os métodos `completed` e `thisMonth` definidos e marcados com o atributo `@scope` no Laravel 12, podemos utilizá-los diretamente em nossas consultas. Voltando ao nosso controller de dashboard, substituímos as chamadas de consulta originais pelos novos scopes: `Order::completed()->thisMonth()->get()`. Ao testar no navegador, observamos que os resultados são idênticos aos anteriores, com seis pedidos que atendem aos critérios de serem concluídos e criados neste mês. Isso demonstra como os scopes tornam as consultas significativamente mais expressivas e fáceis de entender.

    Advanced Query Scopes

    Vamos agora explorar a criação de scopes mais avançados e populares. No modelo `Order`, criaremos uma nova função protegida chamada `popular`. Este escopo permite definir um número mínimo de pedidos totais para considerar um pedido 'popular', com um valor padrão de 100. A consulta filtrará os pedidos onde o campo `total_orders` seja maior ou igual a esse mínimo. Para maior flexibilidade, este escopo aceita um parâmetro opcional para definir o valor mínimo, permitindo consultas como `Order::popular(200)->get()`, que retorna pedidos com mais de 200 orders totais.

    Combinando Scopes para Consultas Poderosas

    A verdadeira força dos query scopes reside na sua capacidade de serem combinados. Podemos encadear múltiplos scopes para criar consultas complexas e altamente específicas. Por exemplo, `Order::completed()->thisMonth()->popular(200)->get()` nos retorna pedidos que são concluídos, criados neste mês e possuem mais de 200 orders totais, resultando em seis pedidos. Esses scopes também se integram perfeitamente com as coleções customizadas, permitindo chamar métodos como `businessSummary()` diretamente no resultado da consulta encadeada.

    Escopo para Incluir Usuário

    Podemos também adicionar escopos que otimizam o carregamento de relacionamentos. Criamos um escopo `withUser` que utiliza o método `with('user')` do Eloquent. Ao aplicar este scope, a relação `user` é automaticamente anexada aos resultados da consulta. Testamos isso buscando pedidos sem o `withUser` (relações vazias) e depois com o `withUser`, onde a relação do usuário aparece corretamente nos resultados.

    Escopo para Período Específico

    Outro escopo poderoso é o `forPeriod`, que permite filtrar pedidos com base em um período especificado como 'today', 'week' ou 'month'. Este escopo utiliza uma lógica de `match` com expressões SQL, tornando-o muito eficiente para lidar com múltiplos intervalos de tempo. Se nenhum período for fornecido, a consulta retorna sem filtros de data. Essa abordagem simplifica a gestão de consultas baseadas em tempo.

    A combinação de todos esses scopes permite a construção de relatórios complexos de maneira clara. Por exemplo, para obter um resumo de negócios de pedidos concluídos deste mês, populares com mais de 300 orders totais e com o relacionamento do usuário carregado, usamos uma cadeia como: `Order::completed()->thisMonth()->popular(300)->withUser()->businessSummary()->get()`. A legibilidade e a expressividade das consultas são notavelmente aprimoradas.

    Conclusão e Próximos Passos

    Transformamos filtros de consulta repetitivos em scopes reutilizáveis e expressivos que funcionam harmoniosamente com nossas coleções customizadas. Isso elimina a necessidade de código duplicado e torna as intenções do código claras, com consultas que leem como requisitos de negócio. Os scopes também funcionam eficazmente em relacionamentos. No próximo episódio, integraremos tudo para construir um sistema de relatórios flexível, combinando o poder dos scopes e das coleções. Se este conteúdo ajudou a organizar seu caos de consultas, considere curtir e se inscrever para mais dicas.

    Useful links

    These links were generated based on the content of the video to help you deepen your knowledge about the topics discussed.

    This article was AI generated. It may contain errors and should be verified with the original source.
    VideoToWordsClarifyTube

    © 2025 ClarifyTube. All rights reserved.