Jump to content

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


Recommended Posts

Добрый день!

Есть функция 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();
    }

 

Link to post
Share on other sites

Переменная $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", скорее всего, совсем неверный.

 

Link to post
Share on other sites

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

 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();
    }

 

Link to post
Share on other sites

Или как можно исправить этот запрос добавив в него новый столбец 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");

 

Link to post
Share on other sites
2 часа назад, esistema1 сказал:

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

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...