sql >> Database >  >> RDS >> Mysql

Laravel 4:Hoe pas ik een WHERE-voorwaarde toe op alle queries van een welsprekende klasse?

Het antwoord werd gegeven toen er geen querybereik was functie beschikbaar.

U kunt de hoofdquery overschrijven, alleen voor de Post model, zoals

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

Gebruik nu gewoon alles, maar niet-goedgekeurde gebruikers verschijnen niet in het resultaat.

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

Als u nu alle berichten wilt ophalen, zelfs niet-goedgekeurde, kunt u

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

Update (met behulp van het querybereik):

Sindsdien biedt Laravel nu Global Query Scopes , gebruik dat in plaats van deze hacky-oplossing, let op de datum van dit antwoord, het is te oud en er zijn inmiddels zoveel dingen veranderd.

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

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

Je kunt het als volgt gebruiken:

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


  1. MySQL:Hoe rijen te kopiëren, maar een paar velden te wijzigen?

  2. Waarom heb je datamodellering nodig?

  3. Hoe de LIKE-operator werkt in MySQL

  4. Installeer PostgreSQL op Ubuntu 18.04