【问题标题】:Yii scope - filter by related ModelYii 范围 - 按相关模型过滤
【发布时间】: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,并实现过滤?

【问题讨论】:

    标签: php mysql sql join yii


    【解决方案1】:

    这个标准现在有帮助:

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

    【讨论】:

    • 为找到自己的解决方案并发布解决方案点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多