No desenvolvimento de aplicações Laravel, frequentemente nos deparamos com a necessidade de reutilizar consultas de banco de dados. Seja filtrando usuários ativos, selecionando produtos específicos ou qualquer outra consulta recorrente, escrever o mesmo código de consulta várias vezes pode ser tedioso e propenso a erros. Aqui, os Laravel Query Scopes entram como uma solução elegante e eficiente.
O que são Laravel Query Scopes?
Os Query Scopes permitem definir consultas comuns que você pode reutilizar em todo o modelo. Eles são métodos no modelo Eloquent que predefinem condições de consulta, que você pode chamar como parte de outras consultas Eloquent. Os Scopes vêm em duas variedades: Local Scopes e Global Scopes.
- Local Scopes permitem definir consultas comuns que podem ser facilmente reutilizadas dentro do modelo. Eles são adicionados à consulta como métodos encadeados.
- Global Scopes permitem definir condições de consulta que são automaticamente aplicadas a todas as consultas para um determinado modelo.
Exemplo de Local Scope
Suponha que você tenha um modelo User e frequentemente precisa filtrar usuários ativos. Ao invés de repetir a condição where('status', '=', 'active') em várias consultas, você pode definir um Local Scope:
class User extends Model { /** * Scope a query to only include active users. * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopeActive($query) { return $query->where('status', 'active'); } }
Para utilizar este scope, você pode fazer o seguinte em qualquer parte do seu código:
$activeUsers = User::active()->get();
Exemplo de Global Scope
Para um Global Scope, vamos considerar que você quer que todas as consultas ao modelo User excluam automaticamente usuários marcados como excluídos (soft delete). Você pode definir um Global Scope assim:
class ActiveScope implements \Illuminate\Database\Eloquent\Scope { public function apply(Builder $builder, Model $model) { $builder->where('deleted_at', '=', null); } } class User extends Model { protected static function booted() { static::addGlobalScope(new ActiveScope); } }
Com isso, todas as consultas ao modelo User agora excluem automaticamente usuários com deleted_at não nulo, sem necessidade de adicionar manualmente essa condição em cada consulta.
Conclusão
Os Laravel Query Scopes são ferramentas incrivelmente poderosas que ajudam a manter seu código de banco de dados DRY (Don't Repeat Yourself), limpo e fácil de ler. Ao utilizar Local e Global Scopes, você pode simplificar significativamente a lógica de consulta em seus modelos Eloquent, tornando seu código mais manutenível e agradável de trabalhar.
Incorpore Query Scopes em seus projetos Laravel e veja como eles podem melhorar a clareza e eficiência de suas consultas de banco de dados.