Dowiedz się, ile razy produkt został zamówiony

9

Próbuję dowiedzieć się, ile razy produkt został zamówiony w ciągu ostatnich dwóch tygodni. Do tej pory mam pętlę, aby uzyskać produkty.

    foreach($productCollection as $product){

    }

Zakładam, że powinienem być w stanie uzyskać szczegóły zamówienia z tym umieszczonym w pętli

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

Nie jestem pewien, jak to filtrować. Wiem, że należy go filtrować według identyfikatora produktu, a zamówienie musi zostać złożone w ciągu ostatnich 2 tygodni.

Jak powinna wyglądać składnia tego zapytania?

rozwijać się
źródło
Czy masz dostęp do MySQL, aby wykonać proste zapytanie, czy chcesz wprowadzić pewne funkcje w Magento?
brentwpeterson
Niestety nie mogę wykonać zapytania MySQL. Zasadniczo chodzi o funkcjonalność i najlepiej byłoby, gdyby działał tylko przy użyciu php
develophper 13.09.2013

Odpowiedzi:

21

Zacznijmy od myślenia o SQL, a nie o Magento (do tego dojdziemy później). Tak bym napisał (ignorując strefy czasowe dla uproszczenia):

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

To zapytanie działa (przetestowałem). Jak więc moglibyśmy napisać to zapytanie w Magento?

  • Po pierwsze, widzimy, że jest całkowicie oparty na sales_flat_order_item- Magento ma specjalną kolekcję zasobów dla tej tabeli; możemy z tego skorzystać.
  • Widzimy, że używa on SUMw jednej z kolumn
  • WHEREma BETWEENklauzulę - prawdopodobnie możemy użyć Zend_Db_Exprdo wygenerowania niestandardowego 2-tygodniowego przedziału czasowego.
  • Wreszcie ma GROUP

Zobaczmy, czy nie możemy tego złożyć razem, dzięki szybkiemu wezwaniu, resetaby upewnić się, że otrzymamy tylko zdefiniowane kolumny i nic więcej:

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

Proste echo $query->getSelect()pokazuje, że zapytanie jest sformatowane całkiem dobrze:

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`

Inne uwagi:

W przyszłości możesz chcieć filtrować ten raport na podstawie statusu zamówienia (dołączenie do innej tabeli) lub możesz upewnić się, że strefy czasowe są dokładne (obecnie raportowanie oparte jest na GMT).

Dołączenie jest proste:

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

Ale dodanie stref czasowych może się skomplikować. Poszukaj Mage_Core_Model_Datemetod, które konwertują znaczniki czasu na i z GMT. Zajrzyj również do kolekcji raportów sprzedaży.

Mam nadzieję, że to pomaga! Powodzenia.

philwinkle
źródło
1
masz rację. W ten sposób załadowanie dowolnych klas Magento byłoby całkowitą przesadą
Sander Mangel
Zobacz moją aktualizację - zapomniałem dołączyć to, co $querybyło!
philwinkle,
Kolejna aktualizacja w celu zastąpienia kwoty w dolarach zakupioną ilością .
philwinkle,
Bardzo dziękuję @ philwinkle .. Dostosowałem do ciebie moje rozwiązanie. Dziękuję raz jeszcze.
Pavan Kumar
można uzyskać tylko produkt konfigurowalny oznacza, że ​​produkt nadrzędny nie jest powiązany z zamówieniem i policzyć, ile czasu sprzedał
Bhupendra Jadeja