Yii 覆盖ActiveQuery中的条件->;init()
在Yii2上,我在Yii 覆盖ActiveQuery中的条件->;init(),yii,yii2,Yii,Yii2,在Yii2上,我在ProjectQuery class ProjectQuery extends \yii\db\ActiveQuery { public function init() { $this->andOnCondition(['deleted' => 0]); parent::init(); } 显然,删除的条件必须始终适用,但在某些情况下可能不适用(例如,用户可以选择查看其删除的项目)。我如何覆盖此条件?我必须使
ProjectQuery
class ProjectQuery extends \yii\db\ActiveQuery
{
public function init()
{
$this->andOnCondition(['deleted' => 0]);
parent::init();
}
显然,删除的条件必须始终适用,但在某些情况下可能不适用(例如,用户可以选择查看其删除的项目)。我如何覆盖此条件?我必须使用不同于init()
的东西吗
(注意,我想将此条件正常应用于所有类型的查询,这就是为什么我在
ProjectQuery
上使用init()
,而不是ProjectSearch
类)您仍然可以使用init()
但要覆盖0,您应该绑定一个参数
public function init()
{
$this->andOnCondition('deleted = :deleted', [':deleted' => 0]);
parent::init();
}
因此,要创建仅显示已删除项目的查询,请编写如下内容:
$query = Project::find()->addParams([':deleted' => 1]);
要显示所有已删除和未删除的项目,您可以向ProjectQuery
对象添加一个函数,对其进行相应修改
public function includeDeleted() {
$this->orOnCondition(['deleted' => 1]);
return $this;
}
然后编写查询,如下所示:
$query = Project::find()->includeDeleted();
您可以使用覆盖现有的条件:
public function init() {
$this->andOnCondition('deleted = :deleted', [':deleted' => 0]);
parent::init();
}
public function includeDeleted() {
$this->onCondition(null);
// remove unused param from old ON condition
unset($this->params[':deleted']);
return $this;
}
如果要覆盖由
where()
、和where
和添加的条件,或者where()
或where()为什么要使用和oncondition()
而不是和where()
,则可以使用相同的方法,因为它需要是一个附加条件。是的,我已经使用了includeDeleted()函数。我的问题是,有没有一种方法可以声明和oncondition
,因此如果在deleted=1的条件下有另一个查找,那么init()
和oncondition
将被忽略?我不知道如何实现这一点,但我会小心使用这种方法。我宁愿创建单独的模型(如未删除的模型的AllPosts
和Posts
),而不是依赖默认条件,默认条件有时应该被覆盖。