我有一个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,并实现过滤?
答案 0 :(得分:1)
此标准现在有所帮助:
$this->getDbCriteria()->mergeWith(array(
'together' => false,
'with'=>'categories',
'condition' => "categories.id IN ($all)"
));