【问题标题】:How to check attributes belongs to specific product in opencart如何检查属性属于opencart中的特定产品
【发布时间】:2015-03-01 23:03:37
【问题描述】:

我正在尝试获取具有多个特定属性的产品。 我的意思是说,我想搜索那些有 "type"=rings 和 "metal"=gold 的产品

我尝试使用 IN 运算符,但它是 OR 运算的替代品。我需要 AND 运算。

product_attribute表只有product_id,attribute_id,那么在mysql中如何执行和操作

opencart 版本 1.5.4

我试过下面的查询

SELECT *   FROM oc_product_attribute  WHERE product_id=42 AND attribute_id=15 AND attribute_id=17

输出为空

【问题讨论】:

  • 请用当前 mysql 查询、该查询的输出和所需的输出更新您的问题。
  • attribute_1d改成attribute_id!!
  • 您是否尝试对类别中的过滤器进行查询,以便它们在组之间具有“AND”逻辑,如果是这样,您将无法使用 IN() 实现它,除非您要更改基础结构。
  • 只有 OR 操作,但我想要 AND 操作,因为我想显示那些具有 attribute_id 15 和 16 的产品。“基本结构”表结构
  • 我听不懂你在说什么... Opencart 默认情况下在其类别过滤器中实现了 OR 逻辑。首先解释一下你是否想要在过滤器或其他部分中说的这个逻辑?其次,通过区分属性组和属性来解释你真正想要的反应。

标签: php mysql opencart


【解决方案1】:

如果您想在同一组中的属性之间使用 OR 逻辑,并且在不同组中的属性之间使用 AND 逻辑,您应该:

  1. 转到“catalog\model\catalog”编辑product.php

  2. 你需要编辑的函数是public function getProducts($data = array(), $get_all = FALSE) {

  3. 在函数的开头指定这些变量:$validimi = false; $filter_groups = array();

  4. 找到这个代码:

    if (!empty($data['filter_filter'])) {
                        $implode = array();
    
                        $filters = explode(',', $data['filter_filter']);
    
                        foreach ($filters as $filter_id) {
                            $implode[] = (int)$filter_id;
                        }
    
                        $sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";
    

    }

  5. 并在 $sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")"; 之前添加这件作品

                $sql_check = "SELECT DISTINCT (filter_group_id) FROM  " . DB_PREFIX . "filter WHERE filter_id IN (" . implode(',', $implode) . ") ";    
                $query_check = $this->db->query($sql_check);
                $filter_groups = array();
                foreach ($query_check->rows as $result) {
                    $filter_groups[$result['filter_group_id']] = array();
                }
    
                if(count($filter_groups) > 1){
                    $validimi = true;               
                }else{
                    $validimi = false;
                }
    
  6. 终于在我指定的函数中找到了这段代码:

    $sql .= " GROUP BY p.product_id";

  7. 并将其更改为:

      If( $validimi ) {
    

    $sql .= "GROUP BY p.product_id HAVING COUNT(DISTINCT pf.filter_id)=".count($filter_groups);

        }else{
    
            $sql .= " GROUP BY p.product_id";
    
        }
    

现在试试你的过滤器,它们应该可以正常工作,这是我在自己的商店中创建和使用的,但使用 opencart 版本 1.5.5.1 但我认为它在你的情况下也可以正常工作。逻辑很清楚,所以如果这段代码对你没有帮助,你可以使用逻辑来创建你自己的:)。

希望我有所帮助。

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多