使用group()在magento中打破getSelectCountSql

时间:2010-08-14 22:54:33

标签: magento

当我使用

$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

由于

5 个答案:

答案 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