Php 如何在CDbCriteria Yii框架中编写复杂的连接查询

Php 如何在CDbCriteria Yii框架中编写复杂的连接查询,php,sql,yii,Php,Sql,Yii,我有两个表:product和document,它们都与document\u id有关 现在我想使用Yii-CDbCriteria通过product\u-id从数据库中获取文档名 比如: SELECT d.* FROM `document` As d, `product_document` AS p WHERE d.document_id=p.document_id AND p.product_id=133; 我想使用CDbCriteria编写相同的查询。我已经试过了,但是我被它的语法卡住了

我有两个表:
product
document
,它们都与document\u id有关

现在我想使用Yii-CDbCriteria通过
product\u-id
从数据库中获取文档名

比如:

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

我想使用
CDbCriteria
编写相同的查询。我已经试过了,但是我被它的语法卡住了。

这里是你的标准,假设你的关系设置正确:

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

哈里有正确的语法。如果您希望在整个应用程序中使其更干净、更可重用,请考虑使用命名范围:

/* 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是一个很好的应用程序用例。为了完整性:@Glenn,您应该将此方法放入
文档
模型中,然后可以像
$documents=Document::model()->forProductId($id)->findAll()
@MichaelHärtl一样使用它,谢谢。我正在从事一个项目,在这个项目中,我一直遇到这种类型的标准代码,我一直在努力鼓励我的同事做出改变,这是非常宝贵的;-)