2015-02-04 2 views
1

Я заметил, что существует несколько способов получить общее количество заказов в Magento, используя getSize(), for loop или count(), однако они предоставляют разные результаты в пределах одного и того же временного диапазона. Хотелось бы узнать, как наилучшим образом получить правильное общее количество заказов в Magento, и какова разница между getSize(), для цикла и count() при расчете количества заказов. Ниже приведен код, который я использовал для тестирования между getSize() и циклом.Как получить правильное общее количество заказов в Magento

//get order total amount 
$OrdersAmount_completed = Mage::getModel('sales/order')->getCollection() 
    ->addAttributeToFilter('status',array('eq' => Mage_Sales_Model_Order::STATE_COMPLETE)) 
    ->addAttributeToFilter('created_at', array(
     'from' => $timefrom, 
     'to' => $timeto,)) 
     // ->getSize() //this generates a difference result with $num_completed 
    ; 
foreach ($OrdersAmount_completed as $order_completed) 
{ 
    $num_completed++; 
} 
+0

Когда вы выполняете 'getSize' или' count', вы получаете '0'? Я думаю, что я помню, что они были ленивы загружены в коллекцию, поэтому 'getSize' и' count' фактически были бы числом, выбранным в коллекцию, а не записями в БД, если только вы не зациклились на всех записях в первую очередь. Однако, если это так, я, похоже, помню звонок, который вы могли бы сделать, чтобы загрузить весь результат без цикла ... я мог ошибаться, это было через несколько месяцев после моего последнего проекта Mage. – prodigitalson

+0

Спасибо за ваш комментарий. Я заметил, что использование getSize и count дает мне такое же неправильное количество заказов (меньше фактической суммы) по сравнению с результатом в Magento backend> Report. Цикл foreach ближе к фактической величине, но все же неверен. – Yolanda

ответ

1

В идеале, размер будет всегда давать вам правильный счет. Если вы входите в подробности, любой getCollection() мы ссылаемся на папку collection.php внутри модели/mysql.

Внутри Magento, collection.php расширяет Mage_Core_Model_Mysql4_Collection_Abstract, которая простирается Mage_Core_Model_Resource_Db_Collection_Abstract которая простирается Varien_Data_Collection_Db

В Varien_Data_Collection_Db, мы имеем GETSIZE() функция, которая:

<?php 
    public function getSize() 
{ 
    if (is_null($this->_totalRecords)) { 
     $sql = $this->getSelectCountSql(); 
     $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams); 
    } 
    return intval($this->_totalRecords); 
} 

public function getSelectCountSql() 
{ 
    $this->_renderFilters(); 

    $countSelect = clone $this->getSelect(); 
    $countSelect->reset(Zend_Db_Select::ORDER); 
    $countSelect->reset(Zend_Db_Select::LIMIT_COUNT); 
    $countSelect->reset(Zend_Db_Select::LIMIT_OFFSET); 
    $countSelect->reset(Zend_Db_Select::COLUMNS); 

    $countSelect->columns('COUNT(*)'); 

    return $countSelect; 
} 
?> 

Мы можем видеть, это становится все рассчитывать из базы данных в зависимости от запроса.

getSize() будет извлекать только счет из базы данных. Если мы получим всю коллекцию и выполним foreach, она будет извлекать все объекты порядка, которые могут быть огромным запросом, а также загружать ширину полосы пропускания базы данных. Следовательно, это нецелесообразно. :)

+0

Спасибо @Blastfreak! Я спрашиваю об этом, потому что я заметил, что использование getSize() и count() дает мне такое же неправильное количество заказов (меньше фактической суммы) по сравнению с результатом в Magento backend> Report. Цикл foreach ближе к фактической величине, но все же неверен. Я думал, что это может иметь какое-то отношение к системному времени, но я тоже это проверял. Не знаете, какая часть данных отсутствует. – Yolanda

0

Я понял это. Это вызвано разницей часовых поясов:

//get Magento time zone 
echo "Magento System time:".date("m/d/Y h:i:s a", Mage::getModel('core/date')->timestamp(time())); 
//get server time zone 
$timezone = date_default_timezone_get(); 
echo "The current server timezone is: " . $timezone; 

Я нашел время сервера использует UTC (Всемирное координированное время), и для Magento это использовать что-то другое.