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?


¿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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.