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



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

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

我该怎么做?这是否像在 Eloquent 子类的构造函数中添加$this->where(..)一样简单?这不会影响其他 CRUD 操作吗?例如不更新未经批准的行?

当没有可用的查询范围功能时,给出了答案。

您可以覆盖主查询,仅适用于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;
    }
}

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

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

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

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

更新(使用查询范围):

由于Laravel现在提供全局查询范围,因此请利用它而不是这个黑客解决方案,请注意此答案的日期,它太旧了,现在很多事情都发生了变化。

// Using a local query scope
class Post extends Eloquent
{
    public function scopeApproved($query)
    {
        return $query->where('approved', 1);
    }
}

您可以像这样使用它:

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

我发现的最接近的东西是雄辩的查询范围。

即使它需要对我的代码(前缀查询)进行微小的更改,它仍然以极大的灵活性为我提供了我正在寻找的内容。

下面是一个示例:

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

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

然后简单地像这样使用它:

$approvedPosts = Post::approved()-><whatever_queries_you_have_here>;

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

您可以根据需要使用全局范围,文档在这里: https://laravel.com/docs/5.6/eloquent#query-scopes

很好的例子是SoftDeletingScope,默认情况下,它应用于使用SoftDeletes特征的模型上的所有查询。

最新更新