Découvrez combien de fois un produit a été commandé

9

J'essaie de savoir combien de fois un produit a été commandé au cours des deux dernières semaines. Jusqu'à présent, j'ai une boucle pour obtenir les produits.

    foreach($productCollection as $product){

    }

Je suppose que je devrais être en mesure d'obtenir les détails de la commande avec celui-ci placé dans la boucle

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

Je ne sais pas trop comment filtrer cela. Je sais qu'il doit être filtré par ID de produit et que la commande doit avoir été effectuée au cours des 2 dernières semaines.

À quoi devrait ressembler la syntaxe pour cette requête, s'il vous plaît?

developpeur
la source
Avez-vous accès à MySQL pour faire une simple requête ou voulez-vous faire des fonctionnalités dans Magento?
brentwpeterson
Malheureusement, je ne peux pas faire de requête MySQL. Essentiellement, c'est pour la fonctionnalité et il serait préférable que cela fonctionne uniquement avec php
develophper

Réponses:

21

Commençons par penser au SQL, pas à Magento (nous y reviendrons plus tard). Je l'écrirais comme tel (en ignorant les fuseaux horaires pour plus de simplicité):

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

Cette requête fonctionne (j'ai testé). Alors, comment pourrions-nous écrire cette requête dans Magento?

  • Tout d'abord, nous voyons qu'il est entièrement basé sur sales_flat_order_item- Magento a une collection de ressources spéciale pour cette table; nous pouvons en faire usage.
  • Nous voyons qu'il utilise un SUMdans l'une des colonnes
  • WHEREa une BETWEENclause - nous pouvons probablement utiliser Zend_Db_Exprpour sortir notre calendrier personnalisé de 2 semaines.
  • Enfin, il a un GROUP

Voyons voir si nous ne pouvons pas le mettre ensemble, alors, avec un appel rapide à resetpour nous assurer que nous obtenons uniquement les colonnes que nous définissons, et rien d'autre:

$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 écho de $query->getSelect()nous montre que la requête est assez bien formatée:

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`

Autres considérations:

À l'avenir, vous souhaiterez peut-être filtrer ce rapport en fonction du statut de la commande (rejoindre une autre table) ou vous assurer que les fuseaux horaires sont exacts (en ce moment, il génère des rapports basés sur GMT).

L'adhésion est simple:

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

Mais l'ajout de fuseaux horaires peut devenir compliqué. Recherchez Mage_Core_Model_Datedes méthodes de conversion d'horodatage vers et depuis GMT. Consultez également la collection des rapports de vente.

J'espère que cela pourra aider! Bonne chance.

philwinkle
la source
1
tu as raison. De cette façon, le chargement de n'importe quelle classe Magento serait une exagération totale
Sander Mangel
Voir ma mise à jour - j'ai oublié d'inclure ce qui $queryétait!
philwinkle
Une autre mise à jour pour remplacer le montant en dollars par la quantité achetée.
philwinkle
Merci beaucoup @philwinkle .. J'ai personnalisé votre solution selon mes besoins. Merci une fois de plus.
Pavan Kumar
peut obtenir uniquement un produit configurable signifie que le produit parent n'est pas associé à la commande et compter le nombre de fois qu'il a vendu
Bhupendra Jadeja