yii обнаружение, если область используется

Мне было интересно, есть ли способ определить, используется ли область при поиске AR в yii?

Например, модель может содержать 2 области:

class MyModel extends CActiveRecord
{
    ...
    function myScope1()
    {
        $this->getDbCriteria()->mergeWith(array(
            'join'=>'etc...',
            'condition'=>'foo = bar',
        ));
        return $this;
    }

    function myScope2()
    {
        $this->getDbCriteria()->mergeWith(array(
            'join'=>'etc...',
            'condition'=>'foo2 = bar2',
        ));
        return $this;
    }
    ....
}

Я называю АР вот так:

$results = MyModel::model()->myScope1()->myScope2()->findAll();

Это очень динамичный сайт, и в нем более двух областей, некоторые из которых используются, некоторые нет. Есть несколько областей, которые не должны применяться, если используется другая область. Чтобы избежать сотен if else Заявления, могу ли я сделать что-то вроде этого:

class MyModel extends CActiveRecord
{
    ...
    function myScope1()
    {
        $this->getDbCriteria()->mergeWith(array(
            'condition'=>'foo = bar',
        ));
        return $this;
    }

    function myScope2()
    {
        if($this->appliedScopes('myScope1')==false)
        {
            // scope myScope1 isn't applied, so apply this scope:
            $this->getDbCriteria()->mergeWith(array(
                'condition'=>'foo2 = bar2',
            ));
        }
        return $this;
    }
    ....
}

1 ответ

Решение

Как правило, придумайте обходной путь почти сразу после публикации!

В моем случае применение "ИЛИ" между двумя областями будет работать, поэтому;

class MyModel extends CActiveRecord
{
    ...
    function myScope1()
    {
        $this->getDbCriteria()->mergeWith(array(
            'join'=>'etc...',
            'condition'=>'foo = bar',
        ));
        return $this;
    }

    function myScope2($useAnd=true)
    {
        $this->getDbCriteria()->mergeWith(array(
            'join'=>'etc...',
            'condition'=>'foo2 = bar2',
        ),$useAnd);
        return $this;
    }
    ....
}

Звонить так:

$results = MyModel::model()->myScope1()->myScope2(false)->findAll();
Другие вопросы по тегам