Mysql
 sql >> Database >  >> RDS >> Mysql

Laravel 4:Come applicare una condizione WHERE a tutte le query di una classe Eloquent?

La risposta è stata data quando non c'era ambito della query funzionalità disponibile.

Puoi sovrascrivere la query principale, solo per il Post modello, come

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

Ora, usa semplicemente qualsiasi cosa, ma gli utenti non approvati non appariranno nel risultato.

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

Ora, se hai bisogno di recuperare tutti i post anche quelli non approvati, puoi usare

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

Aggiorna (usando l'ambito della query):

Poiché, Laravel ora fornisce Ambiti di query globali , sfrutta che invece di questa soluzione hacky, nota la data di questa risposta, è troppo vecchia e molte cose sono cambiate ormai.

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

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

Puoi usarlo come:

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