举个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.