2012-02-22 30 views
4

一個參數傳遞給關聯查詢我有一個MANY_MANY關係:如何在Yii中

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

我得到MYCLASS的結果-instances在siteController:

$obj->rel 

是否有可能(和如何)將param從控制器傳遞給關係的查詢?

回答

6

我很確定這是不可能的,但是你想要做的事情可以用不同的方式實現。
檢查從the Guide如下:

我們可以同時在與()使用動態關係查詢選項和與選項。動態選項將覆蓋如關係()方法中指定的現有選項。 ...

所以,你的查詢可以是這樣的(如果我們要使用預先加載的方法):

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

另見this comment鏈接的文檔

+1

我雖然這樣,在我看來,一個很好的方法來解決這個問題。另一方面,我將永遠不得不重複靜態的「一些條件」,它看起來很醜( – lvil 2012-02-22 15:00:55

+0

好,目前我不能想到一個解決方法,但總是在編程時考慮權衡。醜陋vs whats possible。:) – 2012-02-22 15:22:25

+0

看看@ mashingan的解決方案,它看起來不錯。我的錯誤是 – 2012-02-22 15:35:55

3

你可以試試 「參數命名範圍」 中:

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

+1,很好的解決方案。 – 2012-02-22 15:36:38