Magento - 获得收集计数的最有效方法

时间:2012-07-10 15:20:00

标签: magento

我在Magento中有一个帮助方法,它要求我计算几个不相关的集合。此外,我需要为类别中的每个产品提供此信息,即产品列表视图中的每个产品。所以我可能会在产品列表渲染过程中反复创建大量的集合。

获取集合计数的最有效方法是什么,也就是说,我不需要模型中的任何数据,只需要有多少模型。

是否简单:

Mage::getResourceModel('mymodule/mymodel_collection')->addFilter('myattribute', $value)->count()

或者有更有效的方法吗?

5 个答案:

答案 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正在进行各种缓存。

简而言之:是的,它是计算产品系列中产品数量的最快选择。