Узнайте, сколько раз товар был заказан

9

Я пытаюсь выяснить, сколько раз товар заказывался за последние две недели. Пока у меня есть цикл получения продуктов.

    foreach($productCollection as $product){

    }

Я предполагаю, что смогу получить детали заказа с этим, размещенным внутри цикла

    $order_items = Mage::getResourceModel('sales/order_item_collection')

Я немного не уверен, как это отфильтровать. Я знаю, что он должен быть отфильтрован по идентификатору продукта, а также заказ должен быть сделан в течение последних 2 недель.

Как должен выглядеть синтаксис для этого запроса, пожалуйста?

develophper
источник
У вас есть доступ к MySQL для выполнения простого запроса или вы хотите использовать некоторые функции в Magento?
Brentwpeterson
К сожалению, я не могу сделать запрос MySQL. По сути, это для функциональности, и было бы лучше, если бы он работал только с использованием php
develophper

Ответы:

21

Давайте начнем с размышлений о SQL, а не о Magento (мы доберемся до него позже). Я бы написал так (игнорируя часовые пояса для простоты):

SELECT sku,SUM(qty_ordered) FROM sales_flat_order_item
WHERE created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()
GROUP BY sku

Этот запрос работает (я проверял). Итак, как мы будем писать этот запрос в Magento?

  • Во-первых, мы видим, что он полностью основан на sales_flat_order_item- у Magento есть специальная коллекция ресурсов для этой таблицы; мы можем использовать это.
  • Мы видим, что он использует SUMв одном из столбцов
  • WHEREесть BETWEENпредложение - мы можем, вероятно, использовать Zend_Db_Exprдля вывода нашего пользовательского скользящего 2-недельного периода.
  • Наконец, у него есть GROUP

Давайте посмотрим, если мы не сможем собрать это вместе, тогда с быстрым вызовом, чтобы resetубедиться, что мы получаем только те столбцы, которые мы определяем, и ничего больше:

$query = Mage::getResourceModel('sales/order_item_collection');
$query->getSelect()->reset(Zend_Db_Select::COLUMNS)
        ->columns(array('sku','SUM(row_total)'))
        ->where(new Zend_Db_Expr('created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()'))
        ->group(array('sku'));

Простое эхо $query->getSelect()показывает, что запрос отформатирован довольно хорошо:

SELECT `main_table`.`sku`, SUM(qty_ordered) FROM `sales_flat_order_item` AS `main_table` WHERE (created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()) GROUP BY `sku`

Другие соображения:

В будущем вы можете захотеть отфильтровать этот отчет на основе статуса заказа (присоединение к другой таблице) или вы можете убедиться, что часовые пояса точны (сейчас это отчетность на основе GMT).

Присоединиться просто:

->join(array('e' => 'sales_flat_order'),'main_table.order_id = e.entity_id')

Но добавление часовых поясов может стать сложным. Посмотрите на Mage_Core_Model_Dateнекоторые методы, которые конвертируют метки времени в и из GMT. Также загляните в коллекцию отчетов о продажах.

Надеюсь, это поможет! Удачи.

philwinkle
источник
1
вы правы. Таким образом, загрузка любых классов Magento была бы излишней
Сандер Мангель
Смотрите мое обновление - забыли включить то, что $queryбыло!
Philwinkle
Еще одно обновление, чтобы заменить сумму в долларах для купленного кол-во.
Philwinkle
Большое спасибо @philwinkle .. Я настроил ваше решение в моем требовании. Спасибо еще раз.
Паван Кумар
может получить только настраиваемый продукт, значит родительский продукт не связан с заказом и подсчитать, сколько раз он продан
Bhupendra Jadeja