> LOADING ARTICLE...
17 Dec 2024 Desenvolvimento

Query Scopes no laravel – Os 2 tipos que existem

Query Scopes no laravel – Os 2 tipos que existem

query scopes no laravel

No desenvolvimento com Laravel, a otimização de consultas é essencial para manter a performance e a eficiência da aplicação. Uma técnica poderosa para alcançar isso é o uso de Query Scopes. Query Scopes permitem definir condições comuns e reutilizáveis para as consultas Eloquent, facilitando a manutenção e reutilização do código. Neste artigo, exploraremos o que são Query Scopes, como criá-los e utilizá-los, incluindo a implementação de scopes com PHP Attributes, além de mostrar exemplos práticos e os benefícios que oferecem.

O que são Query Scopes?

Query Scopes são métodos personalizados que pode definir dentro dos seus models para encapsular partes comuns de consultas. Existem dois tipos de Query Scopes: Global Scopes e Local Scopes.

Global Scopes

Global Scopes são aplicados automaticamente a todas as consultas feitas num model. São úteis quando deseja que certas condições sejam aplicadas em todas as consultas de um modelo específico.

Local Scopes

Local Scopes são métodos que pode chamar num model para aplicar uma condição específica a uma consulta. Oferecem uma forma flexível e reutilizável de adicionar lógica às suas consultas.

Como criar e utilizar Query Scopes

Criando Local Scopes

Para criar um Local Scope, você define um método no modelo que começa com o prefixo scope, seguido do nome do escopo. Veja um exemplo de como criar e usar um Local Scope:

class Post extends Model
{
    // Definindo um Local Scope para filtrar posts publicados
    public function scopePublished($query)
    {
        return $query->where('status', 'published');
    }
}

// Utilizando o Local Scope na consulta
$publishedPosts = Post::published()->get();

Neste exemplo, criamos um Local Scope chamado published que filtra os posts com status ‘published’. Podemos então usar esse escopo nas nossas consultas de forma limpa e concisa.

Criando Global Scopes

Para criar um Global Scope, precisamos definir uma classe que implemente a interface Illuminate\Database\Eloquent\Scope e aplicar essa classe ao modelo. Aqui está um exemplo:

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class PublishedScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('status', 'published');
    }
}

class Post extends Model
{
    protected static function booted()
    {
        static::addGlobalScope(new PublishedScope);
    }
}

Agora, todas as consultas no modelo Post terão automaticamente a condição where('status', 'published') aplicada.

webhs
Alojamento recomendado pela DigitalDev

Utilizando PHP Attributes para Query Scopes

A partir do PHP 8, podemos utilizar atributos para adicionar metadados a classes, métodos e propriedades. O Laravel aproveita essa funcionalidade para permitir a definição de scopes diretamente no model utilizando PHP Attributes. Veja como fazer isso:

Definindo um Escopo com PHP Attributes

Primeiro, crie a classe do escopo, implementando a interface Illuminate\Database\Eloquent\Scope:

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class ActiveScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('active', 1);
    }
}

Depois, utilize o atributo #[ScopedBy] no modelo para aplicar o escopo:

use App\Scopes\ActiveScope;
use Illuminate\Database\Eloquent\Model;

#[ScopedBy(ActiveScope::class)]
class User extends Model
{
    // Modelo User com escopo global aplicado usando PHP Attributes
}

Com isso, todas as consultas ao modelo User terão automaticamente o escopo ActiveScope aplicado, filtrando apenas os usuários ativos.

Exemplos práticos e benefícios

Filtragem de Users Ativos

Suponha que você tenha um modelo User e queira filtrar apenas os utilizadores ativos utilizando Local Scope:

class User extends Model
{
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

// Utilizando o Local Scope
$activeUsers = User::active()->get();

Global Scope para Soft Deletes (como funciona)

Pode criar um Global Scope para gerir registos excluídos logicamente (soft deletes):

class NonDeletedScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->whereNull('deleted_at');
    }
}

class User extends Model
{
    protected static function booted()
    {
        static::addGlobalScope(new NonDeletedScope);
    }
}

Benefícios dos Query Scopes

  • Reutilização de Código: Evita repetição de condições comuns em várias partes da aplicação.
  • Manutenção: Facilita a manutenção, permitindo que você altere a lógica de filtragem em um único local.
  • Leitura: Torna as consultas mais legíveis e expressivas.

Conclusão

Query Scopes são uma ferramenta poderosa para otimizar e organizar suas consultas Eloquent no Laravel. Ao encapsular a lógica de filtragem em métodos reutilizáveis, melhora a manutenção do código e a performance da aplicação. Com a introdução de PHP Attributes, aplicar scopes tornou-se ainda mais flexível e conveniente. Entender e aplicar Global Scopes e Local Scopes de forma adequada pode fazer uma grande diferença na eficiência do seu projeto Laravel.

About Post Author

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *