2013-08-26 50 views
2

我有兩個表:productdocument,兩者都與document_id有關係。如何在CDbCriteria中編寫複雜的JOIN查詢Yii Framework

現在我想從數據庫中使用Yii CDbCriteria從product_id獲取文檔名稱。

像:

SELECT d.* 
FROM `document` As d, `product_document` AS p 
WHERE d.document_id=p.document_id 
AND 
p.product_id=133; 

我想寫相同的查詢,但使用CDbCriteria。我已經嘗試過,但是我的語法卡住了。

回答

5

哈利有正確的語法。如果你想讓它在你的應用更清潔,更可重複使用的,可以考慮使用一個名爲範圍:

/* scope in your Document model */ 
public function forProductId($id) { 
    $criteria = new CDbCriteria(); 
    $criteria->condition = 'product.id = :productId', 
    $criteria->with = 'product'; 
    $criteria->params = array(
     ':productId' => (int)$id, 
    ); 
    return $this->dbCriteria()->mergeWith($criteria); 
} 

讓您的設置隨着時間的推移更可重複使用的...

+1

+1的一個很好的用例[參數化命名範圍](http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes)。爲了完整:@Glenn,你應該把這個方法放到你的'Document'模型中,然後可以像'$ documents = Document :: model() - > forProductId($ id) - > findAll()'一樣使用它。 –

+0

@MichaelHärtl謝謝。我正在研究一個項目,我一直遇到這種類型的標準代碼,我一直在努力鼓勵我的同事進行轉變,這是非常寶貴的;-) – acorncom

+0

@acorncom:它的工作原理...感謝幫助 – Sky

2

這是您的標準,假設你有關係,正確設置:

$c = Document::model()->getDbCriteria(); 
$c->with[] = 'product'; 
$c->addCondition('product.product_id = :product_id'); 
$c->params[':product_id'] = 133;