Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Magento中获得正确的订单总数_Php_Magento - Fatal编程技术网

Php 如何在Magento中获得正确的订单总数

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('

我注意到有几种方法可以获得Magento中的订单总数,使用getSize()、for loop或count(),但是,它们在相同的时间范围内提供不同的结果。 我想知道在Magento中获得正确的订单总数的最佳方法是什么,以及在计算订单数时getSize()、for loop和count()之间的区别是什么。下面是我用来测试getSize()和for循环之间的代码

//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循环更接近实际数量,但仍然不正确。我认为这可能与系统时间有关,但我也检查了一下。不确定丢失了数据的哪一部分。