Перейти к содержанию
Официальный форум поддержки Simpla

Как получить результат функции в шаблон


Рекомендуемые сообщения

Добрый день!

Есть функция get_report_purchases она выводит список товаров и кол-во их продаж за период.

Я пытаюсь вывести рядом кол-во возвратов по каждому товара (пример 30 продаж/10 возвратов) добавив функцию get_report_vozvrat, результат get_report_purchases вывожу через foreach, внутри него делаю еще один foreach с выборкой из get_report_vozvrat чтобы получить количество возвратов. 

Сам запрос в базу работает и выводит товары, но ничего не выводится в шаблоне т.к. не могу понять как заставить функцию проверять p.product_id 

 

Помогите, пожалуйста, решить данный вопрос.

 

    function get_report_purchases($filter = array()) { //Выборка товара
        // По умолчанию
        $sort_prod = 'sum_price DESC';

        if(isset($filter['sort_prod'])){
            switch($filter['sort_prod']){
                case 'price':
                    $sort_prod = $this->db->placehold('sum_price DESC');
                break;
                case 'price_in':
                    $sort_prod = $this->db->placehold('sum_price ASC');
                break;
                case 'amount':
                    $sort_prod = $this->db->placehold('amount DESC');
                break;
                case 'amount_in':
                    $sort_prod = $this->db->placehold('amount ASC');
                break;    
            }
        }
        
        $all_filters = $this->make_filter($filter);
        
        // Выбираем заказы
        $query = $this->db->placehold("SELECT 
                o.id, 
                p.product_id, 
                p.variant_id, 
                p.product_name, 
                p.variant_name, 
                SUM(p.price * p.amount) as sum_price, 
                SUM(p.amount) as amount, 
                p.sku FROM __purchases AS p 
            LEFT JOIN __orders AS o ON o.id = p.order_id 
            LEFT JOIN __orders_labels AS ol ON o.id=ol.order_id 
            WHERE 1 $all_filters AND p.product_id > 9000
            GROUP BY p.product_id 
            ORDER BY $sort_prod");
                
        $this->db->query($query);
        return $this->db->results();
    }
    
    
    
    
    
    
       function get_report_vozvrat($filter = array(),$id) { //Выборка возвратов
        // По умолчанию
         $product_id = '';
         
          if(isset($filter['product_id']))
         $product_id = $this->db->placehold('AND p.product_id = ?', intval($filter['product_id']));   

        $all_filters = $this->make_filter($filter);
        
        // Выбираем заказы
        $query = $this->db->placehold("SELECT 
                o.id, 
                p.product_id, 
                SUM(p.amount) as amount, 
                p.sku FROM __purchases AS p 
            LEFT JOIN __orders AS o ON o.id = p.order_id 
            LEFT JOIN __orders_labels AS ol ON o.id=ol.order_id 
            WHERE 1 $all_filters AND ol.label_id = 1 AND p.product_id=?
            ");
                
        $this->db->query($query);
        return $this->db->results();
    }

 

Ссылка на сообщение
Поделиться на другие сайты

Переменная $product_id нигде не используется. Возможно, надо вместо
WHERE 1 $all_filters AND ol.label_id = 1 AND p.product_id=?
писать 
WHERE 1 $all_filters AND ol.label_id = 1 $product_id

И  объявление функции
function get_report_vozvrat($filter = array(),$id) {
странное, надо
function get_report_vozvrat($filter = array()) {
 

И сам по себе подход странный. Обычно не делают такие выборки, при большом кол-ве заказов возможны тормоза вплоть до зависания.

И сомнительно, что запрос работает правильно, если в нем считается SUM без группировки результатов.

И подход "результат get_report_purchases вывожу через foreach, внутри него делаю еще один foreach с выборкой из get_report_vozvrat", скорее всего, совсем неверный.

 

Ссылка на сообщение
Поделиться на другие сайты

Если делать так , то все равно ничего не получается.. Выводятся подряд все возможные значения цикла

 function get_report_vozvrat($filter = array()) { //Выборка возвратов
        // По умолчанию
         $product_id = '';
         
          if(isset($filter['product_id']))
         $product_id = $this->db->placehold('AND p.product_id = ?', intval($filter['product_id']));   

        $all_filters = $this->make_filter($filter);
        
        // Выбираем заказы
        $query = $this->db->placehold("SELECT 
                o.id, 
                p.product_id, 
                SUM(p.amount) as amount, 
                p.sku FROM __purchases AS p 
            LEFT JOIN __orders AS o ON o.id = p.order_id 
            LEFT JOIN __orders_labels AS ol ON o.id=ol.order_id 
           WHERE 1 $all_filters AND ol.label_id = 1 $product_id
           
            GROUP BY p.product_id
            ");
                
        $this->db->query($query);
        return $this->db->results();
    }

 

Ссылка на сообщение
Поделиться на другие сайты

Или как можно исправить этот запрос добавив в него новый столбец amount_all в котором будет SUM(p.amount) as amount с учетом where ol.label_id = 1

при это в столбце amount должно быть SUM(p.amount) as amount без учета where

SELECT 
                o.id, 
                p.product_id, 
                p.variant_id, 
                p.product_name, 
                p.variant_name, 
                SUM(p.price * p.amount) as sum_price, 
                SUM(p.amount) as amount, 
                p.sku FROM __purchases AS p 
            LEFT JOIN __orders AS o ON o.id = p.order_id 
            LEFT JOIN __orders_labels AS ol ON o.id=ol.order_id 
            WHERE 1 $all_filters AND p.product_id > 9000
            GROUP BY p.product_id 
            ORDER BY $sort_prod");

 

Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, esistema1 сказал:

Или как можно исправить этот запрос добавив в него новый столбец amount_all в котором будет SUM(p.amount) as amount с учетом where ol.label_id = 1

при это в столбце amount должно быть SUM(p.amount) as amount без учета where

Фраза с очень глубоким смыслом. Примерно как ехать в Новосибирск, а приехать в Новгород.

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...