0

我想知道是否有一种方法可以检测是否在 yii 的 AR 搜索中使用了范围?

例如,一个模型可能包含 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;
    }
    ....
}

我这样称呼AR:

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

这是一个非常动态的站点,有超过 2 个范围,有些使用,有些没有。如果正在使用另一个范围,则有几个范围不应应用。为了避免数百条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;
    }
    ....
}
4

1 回答 1

0

典型的,几乎在发布后立即想到一个解决方法!

就我而言,在两个范围之间应用“或”将起作用,所以;

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();
于 2012-09-13T16:04:46.693 回答