【问题标题】:using group() breaks getSelectCountSql in magento在 magento 中使用 group() 会破坏 getSelectCountSql
【发布时间】:2010-08-14 22:54:33
【问题描述】:

当我使用时

$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

谢谢

【问题讨论】:

  • 你为什么不在返回的集合上使用一个普通的 php count() ?
  • 因为它是 mysql 的东西而不是 php 的东西。当你对一个集合调用 count 时,php 会调用执行 mysql 查询的函数。

标签: magento


【解决方案1】:

我更新了 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;
}

【讨论】:

  • 可以在app/code/local 目录中覆盖各种类,就像法师类一样。使用它而不是“跟踪升级”。
  • +1 to @clockworkgeek - 4 年的 Magento 扎实工作,我从不知道你可以从 app/code/local 覆盖 lib/Varien。干杯。
  • 澄清一下:将 lib/Varien/Data/Collection/Db.php 复制到 app/code/local/Varien/Data/Collection/Db.php 并在那里进行编辑。
  • 使用group by的集合类最好重写一下。
  • 有谁知道 Magento 2 中的等价物是什么?
【解决方案2】:

在某些情况下,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);
}

【讨论】:

    【解决方案3】:

    我已经使用下面的函数解决了这个问题:

    public function getSize()
    {
        return sizeof( $this->getAllIds());
    }
    

    这帮助我解决了 getSize() 在 Magento CE 1.5 中返回 1 个产品集合的问题。

    我已经覆盖了Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 文件并将其放在函数上方。

    【讨论】:

      【解决方案4】:

      非常好的文章 以下是我为使其适合我所做的一些更改

      在目录集合中解析 group by 不需要 Db.php 中建议的更改。 我做了类似的改变 目录->模型->资源->EAV->Mysql4->产品->collection.php 这是我添加到 getSelectCountSql() 的代码

      if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) { $countSelect->reset(Zend_Db_Select::GROUP); }
      

      在这件事得到解决后,但又出现了一个新问题。在分层导航中,所有过滤器的数量都是 1。

      【讨论】:

        【解决方案5】:

        我通过覆盖我的集合的 getSize() 方法,在不触及核心文件的情况下做到了。

        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();
        }
        

        告诉我这是否适合你..

        布尼

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-10
          • 1970-01-01
          • 2011-11-02
          • 1970-01-01
          相关资源
          最近更新 更多