Mysql
 sql >> Base de données >  >> RDS >> Mysql

Laravel 4 :Comment appliquer une condition WHERE à toutes les requêtes d'une classe Eloquent ?

La réponse a été donnée alors qu'il n'y avait pas de étendue de la requête fonctionnalité disponible.

Vous pouvez remplacer la requête principale, uniquement pour le Post modèle, comme

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;
    }
}

Maintenant, utilisez simplement n'importe quoi, mais les utilisateurs non approuvés n'apparaîtront pas dans le résultat.

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

Maintenant, si vous avez besoin de récupérer tous les messages, même ceux non approuvés, vous pouvez utiliser

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

Mise à jour (à l'aide de la portée de la requête) :

Depuis, Laravel fournit désormais Portées de requête globales , tirez parti de cela au lieu de cette solution hacky, notez la date de cette réponse, elle est trop ancienne et tant de choses ont changé maintenant.

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

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

Vous pouvez l'utiliser comme :

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