yii обнаружение, если область используется
Мне было интересно, есть ли способ определить, используется ли область при поиске AR в yii?
Например, модель может содержать 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;
}
....
}
Я называю АР вот так:
$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 ответ
Решение
Как правило, придумайте обходной путь почти сразу после публикации!
В моем случае применение "ИЛИ" между двумя областями будет работать, поэтому;
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();