Php Laravel 4:如何将WHERE条件应用于雄辩类的所有查询?
我正在尝试为我拥有的表实现一个“approved”状态,基本上,如果行的approve列等于1,那么这非常简单;应该检索该行,否则就不应该检索该行 问题是,现在我必须遍历整个代码库并添加一个WHERE语句(即函数调用),这不仅耗时而且效率低下(如果我想删除该特性,等等)Php Laravel 4:如何将WHERE条件应用于雄辩类的所有查询?,php,mysql,laravel,laravel-4,eloquent,Php,Mysql,Laravel,Laravel 4,Eloquent,我正在尝试为我拥有的表实现一个“approved”状态,基本上,如果行的approve列等于1,那么这非常简单;应该检索该行,否则就不应该检索该行 问题是,现在我必须遍历整个代码库并添加一个WHERE语句(即函数调用),这不仅耗时而且效率低下(如果我想删除该特性,等等) 我该怎么做?是否像在雄辩的子类构造函数中添加$this->where(…)那样简单?这不会影响其他CRUD操作吗?例如不更新未批准的行?我找到的最接近的东西是 尽管它需要对我的代码(前缀查询)做一点小小的更改,但它仍然给了我很大
我该怎么做?是否像在雄辩的子类构造函数中添加
$this->where(…)
那样简单?这不会影响其他CRUD操作吗?例如不更新未批准的行?我找到的最接近的东西是
尽管它需要对我的代码(前缀查询)做一点小小的更改,但它仍然给了我很大的灵活性
下面是一个例子:
在Elount子类中创建函数:
class Post extends Eloquent {
public function scopeApproved($query)
{
return $query->where('approved', '=', 1/*true*/);
}
}
然后简单地像这样使用它:
$approvedPosts = Post::approved()-><whatever_queries_you_have_here>;
$approvedPosts=Post::approved()->;
工作正常。WHERE函数调用没有重复。易于修改。更易于阅读(approved()
比WHERE('approved','=',1)
)更有意义。答案是在没有可用功能时给出的。
您可以覆盖主查询,仅针对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();
您可以根据需要使用全局范围,相关文档如下:
一个很好的例子是SoftDeletingScope,它默认应用于使用SoftDeletingScope特性的模型上的所有查询。您可以查看一下,但我不确定如何实现it@intelis有趣,但遗憾的是,它对于管理数据表示(例如,将名字大写)似乎很有用这不是我要找的形式。你可以尝试覆盖模型上的::all()方法吗?我不知道它是否有效,但类似的东西…@intelis可能有效,但我的大多数CRUD操作都没有使用
all()
(主要是find()
,findOrFail()
,where(…)->take()
,等等)。您提供的黑客解决方案允许在全局范围不允许的情况下访问模型变量,因此它仍然很好。