我在Magento中有一个帮助方法,它要求我计算几个不相关的集合。此外,我需要为类别中的每个产品提供此信息,即产品列表视图中的每个产品。所以我可能会在产品列表渲染过程中反复创建大量的集合。
获取集合计数的最有效方法是什么,也就是说,我不需要模型中的任何数据,只需要有多少模型。
是否简单:
Mage::getResourceModel('mymodule/mymodel_collection')->addFilter('myattribute', $value)->count()
或者有更有效的方法吗?
答案 0 :(得分:68)
要计算集合中的项目,请使用getSize()
方法:
$collection->getSize();
从不使用php count()
函数或集合的count()
方法,如下所示:
count($collection)
$collection->count()
使用count()
函数/方法时,Magento会从数据库中加载集合的所有项目。在大型集合中,您将拥有巨大的内存使用量,并可能出现Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 71 bytes)
...
答案 1 :(得分:1)
尝试:
$collection = Mage::getResourceModel('mymodule/mymodel_collection')->addFieldFilter('myattribute', $value);
$collection->count();
//or
$collection->getSize();
答案 2 :(得分:0)
使用内置的Magento方法,这是最有效的方法:
$ids = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('entity_id')
->addFieldToFilter('status', array('eq'=>'1'))
->addFieldToFilter('visibility', array('eq'=>'4'))
->addFieldToFilter('type_id', array('in'=>array('simple')))
->getAllIds();
var_dump(count($ids));
答案 3 :(得分:-2)
/**
* Retrieve collection all items count
*
* @return int
*/
public function getSize()
{
$this->load();
if (is_null($this->_totalRecords)) {
$this->_totalRecords = count($this->getItems());
}
return intval($this->_totalRecords);
}
所以getSize()效率不高。
答案 4 :(得分:-14)
非常好的问题。根据我在源代码中找到的内容,这是最快的选项,即使它在Varien_Data_Collection中执行以下操作:
public function count()
{
$this->load();
return count($this->_items);
}
因此它会执行常规操作并继续加载您指定的任何内容,就像迭代单个项目时一样。这里没有神奇的SQL COUNT()
。我发现与计算产品有关的唯一其他方法是getSelectCountSql()
和getProductCountSelect()
,但它们只返回SQL代码。
但是:整个EAV和Magento的查询构建器非常聪明,所以不应该那个很重要。另外,我敢打赌,Magento正在进行各种缓存。
简而言之:是的,它是计算产品系列中产品数量的最快选择。