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


How to pass a parameter to relational query in Yii

我有一个MANY_MANY关系:

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

我在站点中得到了Myclass的结果实例Controller:

$obj->rel

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

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

我们可以在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();

另请参阅链接文档

中的此注释

您可以尝试"参数化命名作用域":

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