Magento product report resource collection allows you to get most popular products based on different options for example total number of product orders.
functions we will use: addOrdersCount, setOrder
Let's load this resource collection first like this:
$storeId = Mage::app()->getStore()->getId();
$products = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->setStoreId($storeId)
->addStoreFilter($storeId)
->setPageSize(5);
Now, we can pass our filter on the product collection:
$products->addOrdersCount();
// you can pass date range as well
$from = '2013-01-01';
$to = '2013-01-10';
$products->addOrdersCount($from, $to);
$products->setOrder('orders', 'desc');
Source: app\code\core\Mage\Reports\Model\Resource\Product\Collection.php where addOrdersCount looks like below in magento 1.7.0.2
/**
* Add orders count
*
* @param string $from
* @param string $to
* @return Mage_Reports_Model_Resource_Product_Collection
*/
public function addOrdersCount($from = '', $to = '')
{
$orderItemTableName = $this->getTable('sales/order_item');
$productFieldName = sprintf('e.%s', $this->getProductEntityId());
$this->getSelect()
->joinLeft(
array('order_items' => $orderItemTableName),
"order_items.product_id = {$productFieldName}",
array())
->columns(array('orders' => 'COUNT(order_items2.item_id)'))
->group($productFieldName);
$dateFilter = array('order_items2.item_id = order_items.item_id');
if ($from != '' && $to != '') {
$dateFilter[] = $this->_prepareBetweenSql('order_items2.created_at', $from, $to);
}
$this->getSelect()
->joinLeft(
array('order_items2' => $orderItemTableName),
implode(' AND ', $dateFilter),
array()
);
return $this;
}
And, setOrder looks like this:
/**
* Set order
*
* @param string $attribute
* @param string $dir
* @return Mage_Reports_Model_Resource_Product_Collection
*/
public function setOrder($attribute, $dir = self::SORT_ORDER_DESC)
{
if (in_array($attribute, array('carts', 'orders','ordered_qty'))) {
$this->getSelect()->order($attribute . ' ' . $dir);
} else {
parent::setOrder($attribute, $dir);
}
return $this;
}