Laravel 4:如何将WHERE条件应用于Eloquent类的所有查询?

Abd*_*ziz 11 php mysql laravel eloquent laravel-4

我正在尝试为我拥有的表实现"已批准"状态,这非常简单,基本上,如果行的批准列等于1;应检索该行,否则不应该.

问题是,现在我必须通过整个代码库并添加一个WHERE语句(即函数调用),这不仅耗时而且效率低(如果我想删除该功能等)

我怎样才能做到这一点?是否像$this->where(..)在Eloquent子类的构造函数中添加一样容易?这不会影响其他CRUD操作吗?比如没有更新未经批准的行?

The*_*pha 17

您可以覆盖主查询,仅适用于Post模型,例如

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,只需使用任何内容,但未经批准的用户将不会出现在结果中.

$approvedPosts = Post::where('title',  'like', '%Hello%');
Run Code Online (Sandbox Code Playgroud)

现在,如果您需要检索所有帖子甚至未经批准的帖子,那么您可以使用

$approvedPosts = Post::allowUnapprovedPosts()->where('title',  'like', '%Hello%');
Run Code Online (Sandbox Code Playgroud)

更新:

因为,Laravel现在提供全局查询范围,利用它而不是这个hacky解决方案,注意这个答案的日期,它太旧了,现在改变了很多东西.


Abd*_*ziz 8

我找到的最接近的是Eloquent查询范围.

即使它需要对我的代码进行微小的更改(为查询添加前缀),它仍然能够以极大的灵活性为我提供所需的内容.

这是一个例子:

在Eloquent子类中创建一个函数:

class Post extends Eloquent {

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

}
Run Code Online (Sandbox Code Playgroud)

然后简单地使用它:

$approvedPosts = Post::approved()-><whatever_queries_you_have_here>;
Run Code Online (Sandbox Code Playgroud)

完美的工作.没有丑陋的重复WHERE函数调用.易于修改.更容易阅读(approved()比更有意义where('approved', '=', 1))