当我使用
时$collection->getSelect()->group('entity_id')
或
$collection->groupByAttribute('entity_id')
它打破了getSelectCountSql,我得到1条记录和1页。 Magento
$countSelect->columns('COUNT(DISTINCT e.entity_id)');
有没有办法解决它?
我遇到它,同时重写Mage_Adminhtml_Block_Catalog_Product_Grid的_prepareCollection
由于
答案 0 :(得分:28)
我更新了 lib / Varien / Data / Collection / Db.php 文件,因为我必须让它工作。您必须跟踪此升级,但它可以工作。
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);
// Count doesn't work with group by columns keep the group by
if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) {
$countSelect->reset(Zend_Db_Select::GROUP);
$countSelect->distinct(true);
$group = $this->getSelect()->getPart(Zend_Db_Select::GROUP);
$countSelect->columns("COUNT(DISTINCT ".implode(", ", $group).")");
} else {
$countSelect->columns('COUNT(*)');
}
return $countSelect;
}
答案 1 :(得分:3)
在某些情况下,Eric的方法不起作用。
最好将getSize()
方法重写为
public function getSize()
{
if (is_null($this->_totalRecords)) {
$sql = $this->getSelectCountSql();
$result = $this->getConnection()->fetchAll($sql, $this->_bindParams);;
foreach ($result as $row) {
$this->_totalRecords += reset($row);
}
}
return intval($this->_totalRecords);
}
答案 2 :(得分:1)
我已使用以下功能解决了这个问题:
public function getSize()
{
return sizeof( $this->getAllIds());
}
这帮助我解决了getSize()
在Magento CE 1.5中返回1项产品收集的问题。
我已覆盖Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
文件并置于功能上方。
答案 3 :(得分:0)
非常好的文章 为了使它适合我,我做了一些改变
在目录集合中解析group by时,不需要在Db.php中建议的更改。 我做了类似的改变 目录 - >模型 - > Ressource-> EAV-> Mysql4->产品 - > collection.php 这是我添加到getSelectCountSql()
的代码if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) { $countSelect->reset(Zend_Db_Select::GROUP); }
在此事情得到解决后会出现一个新问题..在所有过滤器的分层导航数量为1。
答案 4 :(得分:0)
我通过覆盖我的集合的getSize()方法而没有触及Core文件。
public function getSize()
{
if (count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) {
// Create a new collection from ids because we need a fresh select
$ids = $this->getAllIds();
$new_coll = Mage::getModel('module_key/model')->getCollection()
->addFieldToFilter('id', array('in' => $ids));
// return the collection size
return $new_coll->getSize();
}
return parent::getSize();
}
告诉我这是否对你有用..
Bouni