2014-01-24 3 views
1

으로 필터링 나는 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)) 

내 문제는 이중 조인입니다. 그래서 with 메서드를 가진 두 번째 JOIN을 추가합니다.

관계 기반 JOIN 만 사용하고 필터링을 수행하려면 어떤 범위를 변경해야합니까?

답변

1

이 기준은 지금 도움 :

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

찬성 투표를 솔루션을 자신을 발견하고, 게시. – crafter