2014-01-23 53 views
0

例如,我有两个MANY_MANY关系的相关模型。 需要查找所有名称包含'test'或其中关系model2.name包含'test'的模型。yii通过使用有相关模型找到模型

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

 
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.To一起使用时,Yii试图从相关表中选择所有列,这是冗余的,将来可能会很慢,因为关系数量可能会比这个例子中的数量多得多。

有什么想法吗?

谢谢。

回答

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', 
       ) 
      ) 
     ), 
    ) 
); 
+0

结果我们有逻辑AND(M1.name LIKE'test'和M2.name LIKE'test'),但我需要OR – axon

+0

感谢与范围的想法,我forg关于这个功能。现在似乎我找到了解决办法,但需要时间进行检查 – axon