例如,我有两个与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试图从相关表中选择所有列,它是冗余的,将来可能会很慢,因为关系数量可能会比这个例子中的更多。
有什么想法吗?
感谢。
答案 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',
)
)
),
)
);