Averigüe cuántas veces se ordenó un producto

9

Estoy tratando de averiguar cuántas veces se ordenó un producto en las últimas dos semanas. Hasta ahora tengo un bucle para obtener los productos.

    foreach($productCollection as $product){

    }

Supongo que debería poder obtener los detalles del pedido con esto colocado dentro del bucle

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

No estoy seguro de cómo filtrar esto. Sé que debe filtrarse por ID de producto y también el pedido debe haberse realizado en las últimas 2 semanas.

¿Cómo debería ser la sintaxis para esta consulta, por favor?

desarrollador
fuente
¿Tiene acceso a MySQL para hacer una consulta simple o desea hacer alguna funcionalidad en Magento?
brentwpeterson
Lamentablemente no puedo hacer una consulta MySQL. Esencialmente es por funcionalidad y sería mejor si funcionara solo con php
Desarrollador

Respuestas:

21

Comencemos pensando en el SQL, no en Magento (llegaremos allí más adelante). Lo escribiría como tal (ignorando las zonas horarias por simplicidad):

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

Esa consulta funciona (probé). Entonces, ¿cómo haríamos para escribir esta consulta en Magento?

  • En primer lugar, vemos que está completamente basado en sales_flat_order_item: Magento tiene una colección especial de recursos para esta tabla; podemos hacer uso de eso.
  • Vemos que usa un SUMen una de las columnas
  • WHEREtiene una BETWEENcláusula: probablemente podamos usarla Zend_Db_Exprpara generar nuestro marco de tiempo de 2 semanas.
  • Finalmente, tiene un GROUP

Veamos si no podemos armarlo, entonces, con una llamada rápida resetpara asegurarnos de que solo obtengamos las columnas que definimos, y nada más:

$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'));

Un simple eco de $query->getSelect()nos muestra que la consulta está formateada bastante bien:

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`

Otras Consideraciones:

En el futuro, es posible que desee filtrar este informe en función del estado del pedido (unirse a otra tabla) o puede asegurarse de que las zonas horarias sean precisas (en este momento está informando en base a GMT).

Unirse es simple:

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

Pero agregar zonas horarias puede ser complicado. Busque Mage_Core_Model_Datealgunos métodos que conviertan las marcas de tiempo hacia y desde GMT. También mire la colección de informes de ventas.

¡Espero que ayude! La mejor de las suertes.

philwinkle
fuente
1
tienes razón. De esta forma, cargar cualquier clase de Magento sería una exageración completa
Sander Mangel
Vea mi actualización: ¡olvidé incluir lo que $queryestaba!
philwinkle
Otra actualización para sustituir el monto en dólares por la cantidad comprada.
philwinkle
Muchas gracias @philwinkle .. He personalizado su solución en mi requerimiento. Gracias otra vez.
Pavan Kumar
solo se puede obtener un producto configurable significa que el producto principal no está asociado al pedido y cuenta cuántas veces se vendió
Bhupendra Jadeja