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”一起使用。
有什么建议吗?我该如何解决这个问题?
答案 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();