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

Joh*_*son 10 magento

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

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

简单来说:

Mage::getResourceModel('mymodule/mymodel_collection')->addFilter('myattribute', $value)->count()
Run Code Online (Sandbox Code Playgroud)

或者有更有效的方法吗?

小智 69

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

$collection->getSize();
Run Code Online (Sandbox Code Playgroud)

永远不要使用php count()函数或count()集合的方法,如下所示:

count($collection)
$collection->count()
Run Code Online (Sandbox Code Playgroud)

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


Rud*_*eim -14

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

public function count()
{
    $this->load();
    return count($this->_items);
}
Run Code Online (Sandbox Code Playgroud)

因此,它会执行通常的操作并继续加载您指定的任何内容,就像您迭代各个项目时所做的那样。这里没有神奇的 SQL COUNT()。我发现的与计算产品有关的唯一其他方法是getSelectCountSql()getProductCountSelect(),但它们只返回 SQL 代码。

但是:整个 EAV 和 Magento 的查询构建器都非常智能,所以这不是什么大问题。另外,我敢打赌 Magento 具有各种缓存功能。

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

  • -1:这不是最快的。情况恰恰相反。在大型集合上,由于内存限制,这只会使 PHP 崩溃,因此与“getSize()”方法相比,它会花费无限多的时间。 (5认同)