Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Laravel 4:Como aplicar uma condição WHERE a todas as consultas de uma classe Eloquent?

A resposta foi dada quando não havia escopo de consulta recurso disponível.


Você pode substituir a consulta principal, apenas para o Post modelo, como
class Post extends Eloquent
{
    protected static $_allowUnapprovedPosts = false;

    public function newQuery()
    {
        $query = parent::newQuery();

        if (!static::$_allowUnapprovedPosts) {
            $query->where('approved', '=', 1);
        } else {
            static::$_allowUnapprovedPosts = false;
        }

        return $query;
    }

    // call this if you need unapproved posts as well
    public static function allowUnapprovedPosts()
    {
        static::$_allowUnapprovedPosts = true;

        return new static;
    }
}

Agora, basta usar qualquer coisa, mas usuários não aprovados não aparecerão no resultado.
$approvedPosts = Post::where('title',  'like', '%Hello%');

Agora, se você precisar recuperar todas as postagens, mesmo as não aprovadas, poderá usar
$approvedPosts = Post::allowUnapprovedPosts()->where('title',  'like', '%Hello%');

Atualização (usando o escopo da consulta):


Desde então, o Laravel agora fornece Escopos de consulta globais , aproveite que, em vez dessa solução hacky, observe a data desta resposta, é muito antiga e muitas coisas mudaram agora.
// Using a local query scope
class Post extends Eloquent
{

    public function scopeApproved($query)
    {
        return $query->where('approved', 1);
    }
}

Você pode usá-lo como:
$approvedPosts = Post::approved()->get();