[Помогите] Вывод минимальной цены категории

Тема в разделе "OpenCart", создана пользователем cereberlum, 21 мар 2018.

  1. cereberlum

    cereberlum

    Регистрация:
    26 май 2013
    Сообщения:
    756
    Симпатии:
    269
    Имеем 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']; ?>
    Но что-то получается неизвестный индекс, модификаторы обновлял, что может быть не так?
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Либо это не то место, либо потом какой-то модификатор этот код удаляет. Посмотрите как выглядит файл в кеше модификаторов.

    Или где у вас вообще андефайнед индекс возникает, в шаблоне или в моделе?
     
  3. cereberlum

    cereberlum

    Регистрация:
    26 май 2013
    Сообщения:
    756
    Симпатии:
    269
    Только что разобрался, оказывается тема использует другой контроллер в этом месте, теперь другая проблема, запрос возвращает 0.
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Ну, запрос вообще странный. Зачем там райт джоины и зачем вообще вызывать таблицу category, если интересуют только цены, только ради c.status = 1?
     
    Master2KAZ нравится это.
  5. cereberlum

    cereberlum

    Регистрация:
    26 май 2013
    Сообщения:
    756
    Симпатии:
    269
    А фиг знает, я нашел такой вариант кода, как я понимаю 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;
            }
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Вопрос был не в том, зачем вообще джоины, а почему именно райт? Ну, и вопрос возник потому, что если я правильно понимаю, то с райт джоином запрос будет вытягивать кучу лишних записей из product на этапе обработки. То есть жрать лишние ресурсы.

    Можно попробовать так:
    PHP:
    "SELECT LEAST(p.price, 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"
     
    Master2KAZ и cereberlum нравится это.
  7. d.im_a

    d.im_a

    Регистрация:
    21 сен 2021
    Сообщения:
    3
    Симпатии:
    0
    cereberlum,
    а как сделать вывод максимальной цены?
     
  8. Роджер

    Роджер

    Регистрация:
    12 ноя 2018
    Сообщения:
    22
    Симпатии:
    10
    Код:
     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
     
  9. d.im_a

    d.im_a

    Регистрация:
    21 сен 2021
    Сообщения:
    3
    Симпатии:
    0
    спасибо за ответ, но все равно, почему-то, выводит минимальную....
    Код:
    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;
            }
    
        }
     
  10. Роджер

    Роджер

    Регистрация:
    12 ноя 2018
    Сообщения:
    22
    Симпатии:
    10
    потестил код, да, есть в нем какой то непонятный для меня алгоритм, я вот переписал вот так и получил в результате массив из 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'];
        }
     
    Baco нравится это.
  11. d.im_a

    d.im_a

    Регистрация:
    21 сен 2021
    Сообщения:
    3
    Симпатии:
    0
    спасибо огромное за помощь!!!
    --- Добавлено, 29 сен 2021 ---
    Роджер, но это работает для категорий, где есть дочерние. Почему-то выводит 0 в крайней категории (которая без подкатегорий)