yii通过使用具有相关模型的模型

时间:2014-01-23 07:32:43

标签: activerecord yii

例如,我有两个与MANY_MANY关系相关的模型。 需要查找名称中包含'test'的所有模型或者model2.name中包含'test'的模型。

在sql上我编写了这个查询,这是我想通过使用标准关系机制和CDbCriteria从ActiveRecord得到的结果。

SELECT 
  m1.* 
FROM
  model1 m1 
  LEFT JOIN model_model mm 
    ON mm.from_id = m1.id  
  LEFT JOIN model2 m2 
    ON mm.to_id = m2.id 
GROUP BY m1.id 
HAVING (
    m1.name LIKE '%test%' 
    OR GROUP_CONCAT(m2.name) LIKE '%test%'
);

简单使用Activerecord.findBySql不是一个好的解决方案,因为我有很多模型如上。因此,为了更快地组合任何模型,首选关系。

当我使用CDbCriteria.with Yii生成2个查询。 当我使用CDbCriteria.with和CDbCriteria.together时,Yii试图从相关表中选择所有列,它是冗余的,将来可能会很慢,因为关系数量可能会比这个例子中的更多。

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

您应该在“M1”模型类中定义关系:

public function relations()
{
        return array(        
            'M2s' => array(self::MANY_MANY, 'M2',
                'model_model(from_id, to_id)'),

        );
}

在M2模型中创建范围:

public function nameScope($name)
{
    $this->getDbCriteria()->mergeWith(array(
        'condition'=>'name LIKE :name',
        'params'=>array(':name'=>"%{$name}%"),
    ));
    return $this;
}

如果准备就绪,你可以这样做:

M1::model()->findAll(
    array(
        'condition' => 'name LIKE %test%',
        'with' => array(
            'M2s' => array(
                'scopes' => array(
                    'nameScope' => 'test',
                )
            )
        ),
    )
);