yii检测范围是否正在使用中

时间:2012-09-13 15:57:03

标签: yii scopes named-scopes

我想知道是否有一种方法来检测是否在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();

这是一个非常动态的网站,有两个以上的范围,一些使用,一些不使用。如果正在使用另一个范围,则应该应用几个范围。为了避免数百个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 个答案:

答案 0 :(得分:0)

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

在我的情况下,在两个范围之间应用“OR”将起作用,所以;

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();