Yii 1.1中的默认范围

时间:2015-04-23 08:12:22

标签: php activerecord yii

AR模型玩家:

public function scopes()
{
    return array(
        'proleague' => array(
            'condition' => 'mode = "proleague"',
        ),
        'main' => array(
            'condition' => 'mode = "main"',
        ),
    );
}

使用模型播放器:

Player::model()->
proleague()->
with('startposition')->
findAllByAttributes(... here some condition ...);

^^^这一切都好。范围条件将被执行。但是......

在我的项目中,我有很多地方没有指定播放器模型的任何范围,在这种情况下我需要使用范围条件作为默认

        'main' => array(
            'condition' => 'mode = "main"',
        )

如果我将 defaultScope()方法添加到播放器模型,就像这样

public function defaultScope()
{
    return array(
        'condition' => 'mode = "main"',
    );
}

下一个代码

Player::model()->
proleague()->
with('startposition')->
findAllByAttributes(... here some condition ...);

无法正常运行。我不会得到 mode =“proleague”条件,因为我会将 defaultScope() mode =“main”一起使用。

有什么建议吗?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您应该只使用resetScope(true)方法。它"删除" defaultScope过滤器。

$model = Player::model()->resetScope(true)->proleague();

答案 1 :(得分:0)

为此创建一个新类。

<?php   
## e.g. protected/models/
class MyCoreAR extends CActiveRecord
{
    /**
        * Switch off the default scope
        */
        private $_defaultScopeDisabled = false; // Flag - whether defaultScope is disabled or not


    public function setDefaultScopeDisabled($bool) 
        {
                $this->_defaultScopeDisabled = $bool;
        }

        public function getDefaultScopeDisabled() 
        {
                return $this->_defaultScopeDisabled;
        }

        public function noScope()
        {
        $obj = clone $this;               
        $obj->setDefaultScopeDisabled(true);

        return $obj;
        }

    // see http://www.yiiframework.com/wiki/462/yii-for-beginners-2/#hh16
    public function resetScope($bool = true)
    {
        $this->setDefaultScopeDisabled(true);
        return parent::resetScope($bool);
    }


    public function defaultScope()
    {
        if(!$this->getDefaultScopeDisabled()) {
         return array(
                 'condition' => 'mode = "main"',
            );
        } else {
            return array();
        }
    }
}

在您的代码中:

// no default scope
$model = Player::model()->noScope()->proleague();

// with default scope
$model = Player::model()->proleague();