Magento中getSize()与count()的区别

举个getSize()与count()区别的例子:

// 查询订单的集合
$orderCollection = Mage::getModel('sales/order')->getCollection();

echo $orderCollection->getSize(); // Result 114

$orderCollection->addFieldToFilter('state', array('nin' => array('pending_payment', 'canceled', 'payment_review')));

echo $orderCollection->size(); // result 114
echo "<br>";
echo $orderCollection->count(); // result 65 .

大多数(不是全部)收藏在Varien_Data_Collection_Db中。这是这个类的两个方法

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 count() //inherited from Varien_Data_Collection
{
    $this->load();
    return count($this->_items);
}

有一个区别是对于getSize()来说集合但不load()。对于count()来说通常集合模型使用与getSize()上述相同的方法并且只能重写getSelectCountSql(),但是count()会load()。
在getSelectCountSql()限制被重写,以获得可用于设置过滤器(where语句)的总记录数。看看getSelectCountSql()如何工作的:

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()得到的是正确的结果114.然后添加一个其他的过滤器的集合。但是第一次调用getSize()得到正确的值并记录在$this->_totalRecords中。
第二次再次调用它时,查询不会再执行,因为$this->_totalRecords它不为空,所以直接返回之前保存好的值,114。
如果想要每次得到的getSize()得到的值都是正确的值可以这样做:

$orderCollection = Mage::getModel('sales/order')->getCollection();

//add the filter to the original object
$orderCollection->addFieldToFilter('state', array('nin' => array('pending_payment', 'canceled')));

//clone the collection object
$clone = clone $orderCollection;

//get the size from the clone
echo $clone->getSize();

echo $orderCollection->count(); // given 305  proper result.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值