Yii 覆盖ActiveQuery中的条件->;init()

Yii 覆盖ActiveQuery中的条件->;init(),yii,yii2,Yii,Yii2,在Yii2上,我在ProjectQuery class ProjectQuery extends \yii\db\ActiveQuery { public function init() { $this->andOnCondition(['deleted' => 0]); parent::init(); } 显然,删除的条件必须始终适用,但在某些情况下可能不适用(例如,用户可以选择查看其删除的项目)。我如何覆盖此条件?我必须使

在Yii2上,我在
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
),而不是依赖默认条件,默认条件有时应该被覆盖。