Как передать параметр в реляционный запрос в Yii - PullRequest
4 голосов
/ 22 февраля 2012

У меня есть отношение MANY_MANY:

'rel'=>array(self::MANY_MANY, 'MyClass','table(id_1,id_2)',  
             'condition'=>'some condiotions AND field_name=:param')

Я получаю в результате экземпляры Myclass в siteController:

$obj->rel

Возможно (и как) передать:параметр из контроллера в запрос отношения?

Ответы [ 2 ]

6 голосов
/ 22 февраля 2012

Я почти уверен, что это невозможно, но то, что вы хотите сделать, может быть достигнуто другим способом.Проверьте следующее из Руководство :

Мы можем использовать параметры динамического реляционного запроса как с (), так и с параметром с.Динамические параметры будут перезаписывать существующие параметры, как указано в методе Relations ()....

Таким образом, ваш запрос может выглядеть примерно так (если мы хотим использовать подход с активной загрузкой):

$param='something';
$obj=SomeModel::model()->with(array(
'rel'=>array('condition'=>'some conditions AND field_name=:param',
             'params' => array(':param' => $param))
))->findAll();
// some more code
$obj->rel->attributeOne;

Или при использовании подхода с отложенной загрузкой для выполнения реляционныхquery:

$param='something';
$obj=SomeModel::model()->findByPk(1);
$rels=$obj->rel(array('condition'=>'some conditions AND field_name=:param',
                      'params' => array(':param' => $param)
));

Надеюсь, это поможет.Прочитайте связанное руководство.При необходимости попросите разъяснений.

Редактировать:Как уже упоминалось в комментариях ниже, some conditions может быть помещено в отношение модели, и при запросе необходимо указать только дополнительные условия.Дополнительное условие автоматически AND 'переходит к условию отношения модели.Это кажется противоречащим документации.В любом случае можно использовать следующий код:

// In the model's relation:
'rel'=>array(self::MANY_MANY, 'MyClass','table(id_1,id_2)',  
         'condition'=>'some conditions');

Контроллер:

$param='something';
$obj=SomeModel::model()->with(array(
'rel'=>array('condition'=>'field_name=:param',
             'params' => array(':param' => $param))
))->findAll();

Также см. этот комментарий в связанной документации

3 голосов
/ 22 февраля 2012

Вы можете попробовать "Параметризованные Именованные Области":

function relations() {
    return array(
        'rel'=>array(self::MANY_MANY, 'MyClass','table(id_1,id_2)',  
             'condition'=>'some conditions')
    )
}


public function relByFieldName($fieldValue=5)
{
    $this->getDbCriteria()->mergeWith(array(
        'with' => 'rel',
        'condition' => 'field_name = :value',
        'params' => array(':value' => $fieldValue)
    ));
    return $this;
}

Тогда вы можете использовать это следующим образом:

$models=Model::model()->relByFieldName(100)->findAll();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...