Php 如何在Magento中获得正确的订单总数
我注意到有几种方法可以获得Magento中的订单总数,使用getSize()、for loop或count(),但是,它们在相同的时间范围内提供不同的结果。 我想知道在Magento中获得正确的订单总数的最佳方法是什么,以及在计算订单数时getSize()、for loop和count()之间的区别是什么。下面是我用来测试getSize()和for循环之间的代码Php 如何在Magento中获得正确的订单总数,php,magento,Php,Magento,我注意到有几种方法可以获得Magento中的订单总数,使用getSize()、for loop或count(),但是,它们在相同的时间范围内提供不同的结果。 我想知道在Magento中获得正确的订单总数的最佳方法是什么,以及在计算订单数时getSize()、for loop和count()之间的区别是什么。下面是我用来测试getSize()和for循环之间的代码 //get order total amount $OrdersAmount_completed = Mage::getModel('
//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++;
}
理想情况下,获取大小将始终为您提供适当的计数。如果您想了解详细信息,请参阅model/mysql文件夹中的collection.php 在magento内部,collection.php扩展了
Mage\u Core\u Model\u Mysql4\u collection\u Abstract
它扩展了Mage\u Core\u Model\u Resource\u Db\u collection\u Abstract
它扩展了Varien\u Data\u collection\u 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,它将获取所有order对象,这可能是一个巨大的查询,也会增加数据库带宽。因此,不建议这样做。:) 我已经想出了这个办法。这是由时区差异造成的:
//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,它使用的是不同的时间 当您执行
getSize
或count
时,是否得到0
?我想我记得这些是在集合中延迟加载的,所以getSize
和count
实际上是在集合中获取的数字,而不是数据库中的记录,除非您首先循环了所有记录。然而,如果是这样的话,我似乎记得你可以打一个电话来加载所有的结果而不循环。。。我可能弄错了,这已经是我上一个法师项目的几个月了。谢谢你的评论。我注意到,与Magento backend>Report中的结果相比,使用getSize和count会产生相同的错误订单数量(小于实际数量)。foreach循环更接近实际数量,但仍然不正确。谢谢@Blastfreak!我问这个问题是因为我注意到使用getSize()和count()时,与Magento backend>Report中的结果相比,我得到的订单数量(小于实际数量)是相同的。foreach循环更接近实际数量,但仍然不正确。我认为这可能与系统时间有关,但我也检查了一下。不确定丢失了数据的哪一部分。