Blog EspecializaTi
Carlos Ferreira Por: Carlos Ferreira Comentar

Aprenda como Usar Local Scope no Laravel

Local Scope no Laravel

Salve galera aqui é Carlos Ferreira para mais um tutorial, dessa vez vou falar sobre Local Scope no Laravel.

 

Outro recurso muito útil do Laravel é definir alguns filtros adicionais em querys. Para ficar mais fácil de entender vamos a um exemplo bastante prático e comum, nos temos uma consulta a partir do model Product para retornar todos os produtos, mas, na tabela products temos 2 colunas adicionais, uma chamada visible (boolean) para dizer se o produto está visível ou não na loja, e outra chamada por exemplo price com o preço do produto.

Continuando nesse cenário temos que listar em diversos momentos apenas os produtos visíveis e com o preço maior que R$ 1, porque os preços de R$ 1 são usados para testes em produção… apenas um exemplo.

Como ficaria esse query? Algo mais ou menos assim:

$products = Product::where('visible', true)->where('price', '>', 1)->get();

Essa consulta vai trazer os resultados exatamente como precisamos, ou seja, apenas os produtos visíveis e com o preço superior a R$ 1

Mas, se precisarmos fazer essa mesma consulta em diferentes locais (home da loja, dashboard, categorias e etc) precisamos refazer esses filtros o tempo todo e isso não seria uma boa ideia porque teria que repetir o mesmo código diversas vezes.

 

Agora que entra o Local Scope, com esse recurso podemos definir padrões que podem ser aplicados em nossas consultas a partir de um Model.

Para criar um local scope no laravel basta criar métodos com o seguinte padrão: scopeNomeAaqui(). Vamos criar no Model Product um Scope para filtrar os produtos visíveis e outro para trazer apenas os que são maiores que R$ 1, veja o exemplo:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    /**
     * Produtos visíveis
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeVisible($query)
    {
        return $query->where('visible', true);
    }


    /**
     * Produtos acima de R$ 1
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeExpensivePrice($query)
    {
        return $query->where('price', '>', 1);
    }
}

Agora que já definimos os escopos no Model Product para utilizar, basta fazer assim:

$products = Product::visible()->expensivePrice()->get();

 

A utilização ficou mais simples, e o filtro ficou mais prático, agora no momento de aplicar os filtros não precisamos nos preocupar mais com os nomes das colunas (visible e price) basta simplesmente usar o scope.

 
 

Se quiser centralizar tudo em um único scope pode, desde que tenham relação e façam sentido, veja o exemplo:

/**
 * Produtos visíveis
 * Produtos acima de R$ 1
 *
 * @param \Illuminate\Database\Eloquent\Builder $query
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeVisibleExpensive($query)
{
    return $query->where('visible', true)
                    ->where('price', '>', 1);
}

Para usar:

$products = Product::visibleExpensive()->get();

 
 

Também é possível passar parâmetros dinâmicos para os scopes, veja o exemplo:

public function scopePrice($query, $value)
{
    return $query->where('price', '>', $value);
}

Para usar:

// Neste caso vai retornar apenas os produtos cujo os valores são superiores a R$ 20,00

$products = Product::price(20)->get();

 

Basicamente é isso o conceito de Scope Local, no próximo tutorial vou mostrar um que em vários momentos pode ser mais interessante, porque ele já aplica por padrão o scope, que exatamente o Global Scope, assunto do nosso próximo tutorial;

 

Não esquece de deixar aquele comentário! 🙂

 

Abraços []’s

 

Carlos Ferreira

Sobre o Autor:

Carlos Ferreira

Carlos Ferreira é Analista de Sistemas Experiente, Empreendedor, Fundador da empresa EspecializaTi. Certificações: Comptia Linux +, LPI, Novell Certification.

Todos os direitos reservados © 2018 - EspecializaTi. É proibida a reprodução total ou parcial deste conteúdo.