Переопределить условие из ActiveQuery-> init () - PullRequest
0 голосов
/ 04 мая 2018

На Yii2 у меня есть этот код в ProjectQuery

class ProjectQuery extends \yii\db\ActiveQuery
{
    public function init()
    {
        $this->andOnCondition(['deleted' => 0]);
        parent::init();
    }

Очевидно, что удаленное условие всегда должно применяться, но могут быть случаи, когда это не так (например, возможность для пользователя видеть свои удаленные проекты). Как я могу переопределить это условие? Должен ли я использовать что-то отличное от init()?

(обратите внимание, я хочу применить это условие ко всем видам запросов в обычном режиме, поэтому я использовал init() на ProjectQuery, а не на классе ProjectSearch)

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы можете использовать onCondition() для переопределения существующих on условий:

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(), andWhere и orWhere().

0 голосов
/ 04 мая 2018

Вы все еще можете использовать 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();
...