sql >> Base de Datos >  >> RDS >> Mysql

Laravel 4:¿Cómo aplicar una condición WHERE a todas las consultas de una clase Eloquent?

La respuesta se dio cuando no había ámbito de consulta función disponible.

Puede anular la consulta principal, solo para 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;
    }
}

Ahora, simplemente use cualquier cosa, pero los usuarios no aprobados no aparecerán en el resultado.

$approvedPosts = Post::where('title',  'like', '%Hello%');

Ahora, si necesita recuperar todas las publicaciones, incluso las no aprobadas, puede usar

$approvedPosts = Post::allowUnapprovedPosts()->where('title',  'like', '%Hello%');

Actualizar (Usando el alcance de la consulta):

Desde entonces, Laravel ahora proporciona Ámbitos de consulta globales , aproveche eso en lugar de esta solución pirateada, observe la fecha de esta respuesta, es demasiado antigua y ya han cambiado muchas cosas.

// Using a local query scope
class Post extends Eloquent
{

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

Puedes usarlo como:

$approvedPosts = Post::approved()->get();