php - 拉维尔 4 : How to apply a WHERE condition to all queries of an Eloquent class?

标签 php mysql laravel laravel-4 eloquent

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

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

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

最佳答案

没有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();

关于php - 拉维尔 4 : How to apply a WHERE condition to all queries of an Eloquent class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18678779/

相关文章:

php - echo 在 php 页面中选择选项?

php - 如果我的查询中有太多 OR 运算符,如何优化 mysql 查询?

php - 在 Laravel 网络应用程序中运行网络抓取 cronjob 以将数据保存到数据库的理想方式

php - 将 MySQL 查询结果合并为一条记录

php - Mysql 中的 IF 函数和带有 LEAST() 的 PHP 语句

javascript - 在php中点击动态按钮调用参数化函数

php - 拉维尔 4 : protecting routes provided by a controller

python - Laravel:致命 Python 错误:_Py_HashRandomization_Init:无法获取随机数来初始化 Python Python 运行时状态:预初始化

php - CodeIgniter ActiveRecord 一次一行

php - 在 Laravel 中批量更新具有不同值的表 [设置]