11

我在 Magento 中有一个辅助方法,它要求我计算几个不相关的集合。除此之外,我需要一个类别中每个产品的此信息,即产品列表视图中的每个产品。因此,我可能会在产品列表呈现期间重复创建大量集合。

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

是不是很简单:

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

或者有没有更有效的方法来做到这一点?

4

5 回答 5

72

要计算集合中的项目,请使用以下getSize()方法:

$collection->getSize();

永远不要像这样使用 phpcount()函数或count()集合的方法:

count($collection)
$collection->count()

当您使用count()函数/方法时,Magento 从数据库中加载集合的所有项目。在大型集合中,您将使用大量内存,并且可能会出现诸如Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 71 bytes)...

于 2012-08-08T15:55:43.413 回答
1

尝试如下:

$collection = Mage::getResourceModel('mymodule/mymodel_collection')->addFieldFilter('myattribute', $value);
$collection->count();
//or
$collection->getSize();
于 2012-07-10T18:52:15.640 回答
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));
于 2014-07-22T17:29:55.347 回答
-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() 效率并不高。

于 2013-08-20T23:08:10.717 回答
-14

非常好的问题。从我在源代码中找到的内容来看,这是最快的选项,即使它在 Varien_Data_Collection 中执行以下操作:

public function count()
{
    $this->load();
    return count($this->_items);
}

所以它会做它通常的事情并继续加载你指定的任何东西,就像你迭代单个项目一样。这里没有神奇的 SQL COUNT()。我发现与计数产品有关的唯一其他方法是getSelectCountSql()and getProductCountSelect(),但它们只返回 SQL 代码。

但是:整个 EAV 和 Magento 的查询构建器都非常智能,所以应该没什么大不了的。另外,我敢打赌 Magento 有各种各样的缓存。

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

于 2012-07-10T17:16:47.637 回答