为了账号安全,请及时绑定邮箱和手机立即绑定

Yii2 按属性过滤器过滤产品

Yii2 按属性过滤器过滤产品

PHP
一只萌萌小番薯 2022-01-14 17:11:18
我有一个我想按属性过滤的产品数据库。我有一段产品。每个产品都应该有一组属性,例如颜色和重量。我有 3 个产品。第一个产品具有属性:颜色=红色,第二个产品具有颜色=红色和重量=1000kg,最后一个产品具有颜色=黑色;当我选择红色和黑色时,一切正常,但是当我选择红色和重量 1000 公斤的过滤器时,没有显示产品。这是我ProductSearch模型的一部分。public function search($cat, $params=[]){    $query = Product::find();    $query->joinWith(['productDesc','productCategory','productAttributes']);    $query->andFilterWhere([        'product.id'                => $this->id,        'product.quantity'          => $this->quantity,        'product.stock_status_id'   => $this->stock_status_id,        'product.product_status_id' => $this->product_status_id    ]); // and many more    // Getting data from url:     // category?categories_path=some_category&f=6-Red;7-1000kg;&sort=price_vat    if(isset($params['f'])) {         $filters_raw = explode(';', $params['f']);        $filters_raw = array_filter($filters_raw);        $attr_ids    = [];        $attr_values = [];        foreach ($filters_raw as $filter_arr) {            $filters = explode('-', $filter_arr);            $filter_results[$filters[0]][] = $filters[1];        }    }    if(isset($filter_results)) {        foreach ($filter_results as $attr_id => $filter_res) {            $query->andFilterWhere([                'and',                 ['product_attribute.attribute_id' => $attr_id],                ['product_attribute.value'        => $filter_res]            ]);        }    }}怎么了?
查看完整描述

1 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

如果一个产品可以有多个属性,简单的连接会为每个属性生成多行(因此一个产品可能会重复多次):


| product.id | product_attribute.attribute_id | product_attribute.value |

| ---------- | ------------------------------ | ----------------------- |

| 1          | 120                            | red                     |

| 1          | 121                            | 1000kg                  |

因此,如果您创建一个包含两个属性条件的查询,它们将永远不会被满足,因为没有任何行会匹配“颜色 = 红色和重量 = 1000kg”条件。您需要在一行中加入多个属性,以获得如下内容:


| product.id | pa1.attribute_id | pa1.value | pa2.attribute_id | pa2.value |

| ---------- | ---------------- | --------- | ---------------- | --------- |

| 1          | 120              | red       | 121              | 1000kg    |

为此,您需要删除带有属性的直接连接:


$query->joinWith(['productDesc','productCategory']);

并为每个过滤器分别连接每个属性:


foreach ($filter_results as $attr_id => $filter_res) {

    $query->joinWith("productAttributes as productAttributes{$attr_id}");

    $query->andWhere([

        "productAttributes{$attr_id}.attribute_id" => $attr_id,

        "productAttributes{$attr_id}.value" => $filter_res,

    ]);

}



查看完整回答
反对 回复 2022-01-14
  • 1 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号