Как передать параметр реляционному запросу в Yii

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

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

Я получаю результат – состояние Myclass в siteController:

 $obj->rel 

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

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

Мы можем использовать динамические варианты реляционных запросов как с параметрами (), так и с опцией. Динамические параметры будут перезаписывать существующие параметры, как указано в методе 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; - $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; 

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

 $param='something'; $obj=SomeModel::model()->findByPk(1); $rels=$obj->rel(array('condition'=>'some conditions AND field_name=:param', 'params' => array(':param' => $param) )); - $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(); - $param='something'; $obj=SomeModel::model()->with(array( 'rel'=>array('condition'=>'field_name=:param', 'params' => array(':param' => $param)) ))->findAll(); 

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

Вы можете попробовать «Параметрированные именованные области»:

 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();