2014-01-23 52 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