如何在Yii中将参数传递给关系查询

lvi*_*vil 4 php yii

我有一个MANY_MANY关系:

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

我在siteController中获得Myclass的结果 - 实例:

$obj->rel
Run Code Online (Sandbox Code Playgroud)

是否有可能(以及如何)将:param从控制器传递给关系的查询?

boo*_*dev 6

我很确定这是不可能的,但你想做的事情可以通过不同的方式实现.
请从指南中查看以下内容:

我们可以在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;
Run Code Online (Sandbox Code Playgroud)

或者在使用延迟加载方法执行关系查询时:

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

希望这可以帮助.请阅读链接指南.如果需要,请求澄清.

编辑:
正如下面的评论中已经提到的,some conditions可以放在模型的关系中,并且在查询时只需要指定其他条件.附加条件自动AND应用于模型的关系条件.这似乎与文档相反.无论如何,可以使用以下代码:

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

控制器:

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

另请参阅链接文档中的此注释