集合上的getizize()和count()之间的区别
-
16-10-2019 - |
题
我多次听到他们俩都是一样的。但是我面临一个奇怪的问题,在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(),它将加载整个产品集合。因此,对于大型目录,不建议在任何集合中使用计数功能。