Finden Sie heraus, wie oft ein Produkt bestellt wurde

9

Ich versuche herauszufinden, wie oft ein Produkt in den letzten zwei Wochen bestellt wurde. Bisher habe ich eine Schleife, um die Produkte zu bekommen.

    foreach($productCollection as $product){

    }

Ich gehe davon aus, dass ich in der Lage sein sollte, die Bestelldetails zu erhalten, wenn diese in der Schleife platziert sind

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

Ich bin mir nicht sicher, wie ich das filtern soll. Ich weiß, dass es nach Produkt-ID gefiltert werden muss und dass die Bestellung innerhalb der letzten 2 Wochen erfolgen muss.

Wie sollte die Syntax für diese Abfrage aussehen?

entwickler
quelle
Haben Sie Zugriff auf MySQL, um eine einfache Abfrage durchzuführen, oder möchten Sie einige Funktionen in Magento ausführen?
Brentwpeterson
Leider kann ich keine MySQL-Abfrage durchführen. Im Wesentlichen ist es für die Funktionalität und es wäre am besten, wenn es nur mit PHP
funktioniert

Antworten:

21

Beginnen wir mit dem Nachdenken über SQL und nicht über Magento (wir werden später darauf zurückkommen). Ich würde es als solches schreiben (der Einfachheit halber Zeitzonen ignorieren):

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

Diese Abfrage funktioniert (ich habe getestet). Wie würden wir diese Abfrage in Magento schreiben?

  • Erstens sehen wir, dass es vollständig auf sales_flat_order_item- Magento hat eine spezielle Ressourcensammlung für diese Tabelle; davon können wir Gebrauch machen.
  • Wir sehen, dass es SUMin einer der Spalten ein verwendet
  • WHEREhat eine BETWEENKlausel - wir können wahrscheinlich verwenden, Zend_Db_Exprum unseren benutzerdefinierten rollierenden 2-Wochen-Zeitrahmen auszugeben.
  • Schließlich hat es eine GROUP

Mal sehen, ob wir es nicht zusammenstellen können, mit einem kurzen Aufruf reset, um sicherzustellen, dass wir nur die von uns definierten Spalten erhalten und sonst nichts:

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

Ein einfaches Echo von $query->getSelect()zeigt uns, dass die Abfrage recht gut formatiert ist:

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`

Weitere Überlegungen:

In Zukunft möchten Sie diesen Bericht möglicherweise basierend auf dem Auftragsstatus filtern (Verknüpfung mit einer anderen Tabelle) oder sicherstellen, dass die Zeitzonen korrekt sind (derzeit basiert die Berichterstellung auf GMT).

Der Beitritt ist einfach:

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

Das Hinzufügen von Zeitzonen kann jedoch kompliziert werden. Suchen Sie nach Mage_Core_Model_DateMethoden, mit denen Zeitstempel von und nach GMT konvertiert werden. Schauen Sie sich auch die Sammlung der Verkaufsberichte an.

Ich hoffe, das hilft! Viel Glück.

philwinkle
quelle
1
Du hast recht. Auf diese Weise wäre das Laden von Magento-Klassen völlig übertrieben
Sander Mangel
Siehe mein Update - vergessen zu enthalten, was $querywar!
Philwinkle
Ein weiteres Update, um den Dollarbetrag für die gekaufte Menge zu ersetzen.
Philwinkle
Vielen Dank @philwinkle .. Ich habe Ihre Lösung an meine Anforderungen angepasst. Vielen Dank noch mal.
Pavan Kumar
kann nur konfigurierbares Produkt erhalten bedeutet, dass das übergeordnete Produkt nicht aus der Bestellung zugeordnet ist und wie
oft