Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Laravel 4:Wie wendet man eine WHERE-Bedingung auf alle Abfragen einer Eloquent-Klasse an?

Die Antwort wurde gegeben, als es keinen Abfrageumfang gab Funktion verfügbar.

Sie können die Hauptabfrage nur für den Post überschreiben Modell, wie

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

Verwenden Sie jetzt einfach alles, aber nicht genehmigte Benutzer werden nicht im Ergebnis angezeigt.

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

Wenn Sie jetzt alle Posts abrufen müssen, auch nicht genehmigte, können Sie

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

Aktualisieren (unter Verwendung des Abfragebereichs):

Seitdem bietet Laravel jetzt Global Query Scopes , nutzen Sie das anstelle dieser hackigen Lösung, beachten Sie das Datum dieser Antwort, es ist zu alt und es hat sich inzwischen so viel geändert.

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

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

Sie können es wie folgt verwenden:

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