Имеем opencart 2.3, хочу вывести минимальную цену в категории для дочерних категорий на странице родителя (в блоке, где стандарстно показываются дочерние) вроде как нашел решение тут последовательно делаю: 1) каталог/модель/продукт/продукт перед ГетТоталПродукт вставляю Код: public function getMinPriceFromCategory($category_id) { $query = $this->db->query("SELECT LEAST(p.price,IFNULL(ps.price, p.price)) min_price FROM `" . DB_PREFIX . "category` c RIGHT JOIN `" . DB_PREFIX . "product_to_category` p2c ON p2c.category_id = c.category_id RIGHT JOIN `" . DB_PREFIX . "product` p ON p2c.product_id = p.product_id LEFT JOIN `" . DB_PREFIX . "product_special` ps ON p.product_id = ps.product_id AND ps.date_end >= NOW() AND ps.date_start <= NOW() WHERE c.category_id = " . (int)$category_id . " AND p.status = 1 AND c.status = 1 ORDER BY min_price LIMIT 0,1 "); if ($query->num_rows) { return $query->row['min_price']; } else { return 0; } } 2) каталог/контроллер/продукт/категори после $data['categories'][] = array( Код: 'min_price' => $this->model_catalog_product->getMinPriceFromCategory($result['category_id']), 3) тепплейт категории после <?php echo $category['name']; ?> Код: <?php echo $category['min_price']; ?> Но что-то получается неизвестный индекс, модификаторы обновлял, что может быть не так?
Либо это не то место, либо потом какой-то модификатор этот код удаляет. Посмотрите как выглядит файл в кеше модификаторов. Или где у вас вообще андефайнед индекс возникает, в шаблоне или в моделе?
Только что разобрался, оказывается тема использует другой контроллер в этом месте, теперь другая проблема, запрос возвращает 0.
Ну, запрос вообще странный. Зачем там райт джоины и зачем вообще вызывать таблицу category, если интересуют только цены, только ради c.status = 1?
А фиг знает, я нашел такой вариант кода, как я понимаю c.status = 1 это статус активности категории? Действительно, не самое необходимое в этом запросе. Попробовал вырезать обращения к category (не помогло, ибо криворук). А райт джоин, как я понял, соединяет p2c и p? если удаляю его, то фатальная ошибка. Код: public function getMinPriceFromCategory($category_id) { $query = $this->db->query("SELECT LEAST(p.price,IFNULL(ps.price, p.price)) min_price FROM `" . DB_PREFIX . "product_to_category` p2c RIGHT JOIN `" . DB_PREFIX . "product` p ON p2c.product_id = p.product_id LEFT JOIN `" . DB_PREFIX . "product_special` ps ON p.product_id = ps.product_id AND ps.date_end >= NOW() AND ps.date_start <= NOW() WHERE p2c.category_id = " . (int)$category_id . " AND p.status = 1 ORDER BY min_price LIMIT 0,1 "); if ($query->num_rows) { return $query->row['min_price']; } else { return 0; }
Вопрос был не в том, зачем вообще джоины, а почему именно райт? Ну, и вопрос возник потому, что если я правильно понимаю, то с райт джоином запрос будет вытягивать кучу лишних записей из product на этапе обработки. То есть жрать лишние ресурсы. Можно попробовать так: PHP: "SELECT LEAST(p.price, IFNULL(ps.price, p.price)) AS min_priceFROM `" . DB_PREFIX . "product_to_category` p2cLEFT JOIN `" . DB_PREFIX . "product` p ON (p2c.product_id = p.product_id)LEFT JOIN `" . DB_PREFIX . "product_special` ps ON (p.product_id = ps.product_id AND ps.date_end >= NOW() AND ps.date_start <= NOW())WHERE p2c.category_id = " . (int)$category_id . " AND p.status = 1"
Код: AS пропущено в стартовом топике. тоесть должно быть: public function getMinPriceFromCategory($category_id) { $query = $this->db->query("SELECT LEAST(p.price,IFNULL(ps.price, p.price)) AS min_price FROM `" . от этого и непонятный индекс, тоесть его вообще нет. тебе надо поменять с SELECT LEAST на SELECT GREATEST
спасибо за ответ, но все равно, почему-то, выводит минимальную.... Код: public function getMaxPriceFromCategory($category_id) { $query = $this->db->query("SELECT GREATEST(p.price, IFNULL(ps.price, p.price)) AS max_price FROM `" . DB_PREFIX . "product_to_category` p2c LEFT JOIN `" . DB_PREFIX . "product` p ON (p2c.product_id = p.product_id) LEFT JOIN `" . DB_PREFIX . "product_special` ps ON (p.product_id = ps.product_id AND ps.date_end >= NOW() AND ps.date_start <= NOW()) WHERE p2c.category_id = " . (int)$category_id . " AND p.status = 1 ORDER BY max_price LIMIT 0,1 "); if ($query->num_rows) { return $query->row['max_price']; } else { return 0; } }
потестил код, да, есть в нем какой то непонятный для меня алгоритм, я вот переписал вот так и получил в результате массив из 2-х значений: PHP: public function getMinPriceFromCategory($category_id) { $query = $this->db->query("SELECT MAX(IFNULL(ps.price, p.price)) AS max_price, MIN(IFNULL(ps.price, p.price)) AS min_price FROM `" . DB_PREFIX . "product_to_category` p2c LEFT JOIN `" . DB_PREFIX . "product` p ON (p2c.product_id = p.product_id) LEFT JOIN `" . DB_PREFIX . "product_special` ps ON (p.product_id = ps.product_id AND ps.date_end >= NOW() AND ps.date_start <= NOW()) WHERE p2c.category_id = " . (int)$category_id . " AND p.status = 1"); if ($query->num_rows) { return $query->rows; } else { return 0; } } в результате, данный метод вернёт массив из 2-х значений: min_price и max_price: PHP: $min_price = 0; $max_price = 0; $category_price = $this->model_catalog_product->getMinPriceFromCategory($category_id); if (isset($category_price['min_price'])) { $min_price = (float)$category_price['min_price']; } if (isset($category_price['max_price'])) { $max_price = (float)$category_price['max_price']; }
спасибо огромное за помощь!!! --- Добавлено, 29 сен 2021 --- Роджер, но это работает для категорий, где есть дочерние. Почему-то выводит 0 в крайней категории (которая без подкатегорий)