我多次听到他们俩都是一样的。但是我面临一个奇怪的问题,在CatalogSearch模块的产品集合中,Count()正在返回正确的产品计数,而GetSize()返回零。

因此,基本上这就是我得到的:

$collection->count(); //correct count
$collection->getSize(); //0

但是我希望getize()具有正确的计数,因为它决定是否在搜索页面中显示分页和产品。我正在使用内部连接,左JOIN以及收集中的条件更具体。

有什么想法,为什么我会遇到这个奇怪的问题?

谢谢

更新:

我以前的问题, 如何在Magento中克隆该系列? 我想在一个集合上执行两个不同的操作。第一个集合显示正确的getsize(),但是如果getize()为零,则删除了Where子句并给出了新的条件。之后,我得到了正确的RAW SQL我的期望,并且在MySQL中运行它也给出了正确的记录,但是收藏集中的仅GetSize()给出了零计数。

因此,基本上我可能需要重新加载该集合,因为GetSize()正在使用旧的计数。说得通?

有帮助吗?

解决方案

大多数(如果不是全部)收藏扩展 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() 该集合未加载。为了 count() 这是。通常收集模型使用相同 getSize() 如上上述方法,仅覆盖 getSelectCountSql().
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;
} 

其他提示

当心。这是正确的,但是这些方法被覆盖在 Varien_Data_Collection_Db 如Marius所述

只是看看

// \Varien_Data_Collection::getSize
public function getSize()
{
    $this->load();
    if (is_null($this->_totalRecords)) {
        $this->_totalRecords = count($this->getItems());
    }
    return intval($this->_totalRecords);
}

// \Varien_Data_Collection::count
public function count()
{
    $this->load();
    return count($this->_items);
}

因此,它应该在这个低级别上相同。两种方法都加载集合并计算项目。

更新

哦,我看到一个问题:getize()缓存_totalRecords,这意味着它没有重新计算。检查哪里 _totalRecords 设置了吗?

此答案显示在Google中的“ Magento弄错了”和类似的搜索,因此我想添加可能对某人有用的情况

当您的查询中有小组语句时,

SELECT COUNT(DISTINCT e.entity_id) ... GROUP BY ( at_id_art.value )

MySQL将返回每个组的计数,因此varien_data_collection_db :: getsize()将返回错误的答案,这是因为此函数获取第一行:

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
    }
    return intval($this->_totalRecords);
}

当它填充时

$this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);

它选择了第一行,因此将第一组的总数作为总大小返回。

我最终根据查询中属性的唯一值提出了此代码。

$select = clone $collection->getSelect();
$group = $select->getPart(Zend_Db_Select::GROUP);
$select->reset(Zend_Db_Select::GROUP)->reset(Zend_Db_Select::COLUMNS)->columns("COUNT(DISTINCT {$group[0]})");
$totalCount = $collection->getConnection()->fetchOne($select);

以防万一您最终到达这里,还有另一个简单的修复方法可以尝试:

System -> Index Management

并选择所有内容(即使它们指示“绿色,无需重新索引”,并迫使它们重新索引。

这解决了我空的 getSize() 问题又允许特殊数据库和新的数据库请求找到产品,满足“ IF”条件并正确渲染。

什么时候 count($collection) 与众不同 $collection->getSize() 我不得不 reindex 产品,然后一切正常。

Getize()产品集合没有加载。对于Count(),它将加载整个产品集合。因此,对于大型目录,不建议在任何集合中使用计数功能。

许可以下: CC-BY-SA归因
scroll top