我有一个MANY_MANY关系:
'rel'=>array(self::MANY_MANY, 'MyClass','table(id_1,id_2)',
'condition'=>'some condiotions AND field_name=:param')
我在siteController中获取Myclass的结果 - 实例:
$obj->rel
是否有可能(以及如何)将控制器中的:param传递给关系的查询?
答案 0 :(得分:6)
我很确定这是不可能的,但你想做的事情可以通过不同的方式实现。
检查the Guide:
我们可以在with()和with选项中使用动态关系查询选项。动态选项将覆盖在relationship()方法中指定的现有选项。 ...
所以你的查询可能是这样的(如果我们想使用急切加载方法):
$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)
));
希望这会有所帮助。请阅读链接指南。如果需要,请要求澄清。
编辑:
正如下面的评论中已经提到的,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();
另见链接文档中的this comment
答案 1 :(得分:3)
您可以尝试“参数化命名范围”:
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();