Search code examples
yiiyii2

Override the condition from ActiveQuery->init()


On Yii2 i have this code in ProjectQuery

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

Obviously the deleted condition must always apply, but there could be cases where this isn't true (for example an option for the user to see his deleted projects). How can i override this condition? Do i have to use something different from init() ?

(note, i want to apply this condition to all kind of queries normally, that's why i used init() on ProjectQuery and not the ProjectSearch class)


Solution

  • You can still use init() but to override the 0 you should bind a parameter.

    public function init()
    {
        $this->andOnCondition('deleted = :deleted', [':deleted' => 0]);
        parent::init();
    }
    

    So to create a query that only shows the deleted projects write something like this:

    $query = Project::find()->addParams([':deleted' => 1]);
    

    To show all projects, deleted and not deleted, you could add a function to the ProjectQuery object to modify it accordingly.

    public function includeDeleted() {
        $this->orOnCondition(['deleted' => 1]);
        return $this;
    }
    

    And then write your query like:

    $query = Project::find()->includeDeleted();