【发布时间】:2014-01-24 17:40:17
【问题描述】:
我有一个 Yii 项目,包含产品、类别等。
我正在尝试按类别列表过滤产品,因此我想获取某些类别中的所有产品。
Product 模型与 Category 模型有关系:
...
'categories' => array(self::MANY_MANY, 'ProductCategory', 'product_product_category(product_id, category_id)'),
...
我的产品模型具有以下命名范围:
public function category($categoryWid){
$category = ProductCategory::model()->findByWid($categoryWid); // wid is a custom id
$all = $category->children_ids;
$this->getDbCriteria()->mergeWith(array(
'with'=>array(
'categories'=>array(
'condition' => "categories.id IN ($all)"
)),
));
return $this;
}
当我尝试通过以下方式调用此范围时:
Product::model()->category($categoryWid)->count();
它会生成以下 SQL。
SELECT
COUNT(DISTINCT `t`.`id`)
FROM `product` `t`
LEFT OUTER JOIN `product_product_category` `categories_categories`
ON (`t`.`id`=`categories_categories`.`product_id`)
LEFT OUTER JOIN `product_category` `categories`
ON (`categories`.`id`=`categories_categories`.`category_id`)
WHERE (status = 2) AND (categories.id IN (21,23,22,24,25))
我的问题是双重连接。所以它使用with 方法添加了第二个JOIN。
我必须在范围内更改什么以仅使用基于关系的JOIN,并实现过滤?
【问题讨论】: