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