Yii范围 - 按相关模型过滤

时间:2014-01-24 17:40:17

标签: php mysql sql join yii

我有一个Yii项目,包括产品,类别等。

我正在尝试按类别列表过滤产品,因此我希望获得某些类别的所有产品。

产品型号与类别模型有关:

...
'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))

我的问题是双JOIN。所以它使用with方法添加第二个JOIN。

我必须更改范围才能仅使用基于关系的JOIN,并实现过滤?

1 个答案:

答案 0 :(得分:1)

此标准现在有所帮助:

$this->getDbCriteria()->mergeWith(array(
    'together' => false,
    'with'=>'categories',
    'condition' => "categories.id IN ($all)"
));