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

Posted

技术标签:

【中文标题】Laravel 4:如何将 WHERE 条件应用于 Eloquent 类的所有查询?【英文标题】:Laravel 4: How to apply a WHERE condition to all queries of an Eloquent class? 【发布时间】:2013-09-11 19:03:01 【问题描述】:

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

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

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

【问题讨论】:

你可以看看four.laravel.com/docs/eloquent#accessors-and-mutators,但我不知道我会如何实现它 @intelis 很有趣,但遗憾的是,它对于管理数据表示(例如,大写名字)看起来很有用,这不是我想要的 也许您可以尝试在模型上覆盖 ::all() 方法?我不知道它是否有效,但类似这样..paste.laravel.com/P01 @intelis 这可能有效,但我的大部分 CRUD 操作都没有使用all()(主要是find()findOrFail()where(..)->take() 等)。 【参考方案1】:

当没有可用的query scope 功能时给出了答案。

您可以覆盖主查询,仅适用于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 现在提供了 Global Query Scopes,利用它而不是这个 hacky 解决方案,注意这个答案的日期,它太旧了,现在发生了很多变化。

// Using a local query scope
class Post extends Eloquent


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

你可以像这样使用它:

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

【讨论】:

您提供的 hacky 解决方案允许访问全局范围无法访问的模型变量,因此它仍然非常好。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我找到的最接近的是Eloquent query scope.

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

这是一个例子:

在 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) 更有意义)

【讨论】:

以上是关于Laravel 4:如何将 WHERE 条件应用于 Eloquent 类的所有查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何将`where`条件应用于每条记录

如何使用 Laravel Fluent 按每个 ID(用户)计算列并使用 WHERE 条件?

如何在 Laravel 的 DB 查询中编写两个 where 条件?

Laravel 6:如何将多个 where 子句添加到关系中

如何在 laravel 8 中添加带有 where 条件的验证规则?

如何在laravel中的嵌套关​​系上放置where条件?