Magento Collection Group由getSize提供

时间:2015-02-24 15:27:08

标签: magento collections count group-by

我有一个集合:

$this->_totalVersions = Mage::getModel('downloads/files')
                                ->getCollection()
                                ->addFieldToFilter('customer_groups', array('like' => '%'.$customergroupId.'%'))
                                ->addFieldToFilter('main_table.is_active', 1)
                                ->getSize()

完美的作品!但是当我添加group时,它不起作用。

$this->_totalVersions = Mage::getModel('downloads/files')
                                ->getCollection()
                                ->addFieldToFilter('customer_groups', array('like' => '%'.$customergroupId.'%'))
                                ->addFieldToFilter('main_table.is_active', 1)
                                ->getSelect()->group(array('main_table.name'))
                                ->getSize()

我不想使用->count()count($collection) 因为它拥有90,000多件物品。

有没有合适的方法来计算收藏?

提前致谢,

Martijn

2 个答案:

答案 0 :(得分:5)

首先,感谢Guerra的回复。你指出了我正确的方向。

我刚刚解决了几个小时..诀窍是在资源集XXXXX_Downloads_Model_Mysql4_Files_Collection中添加一个过滤器

public function addGroupByNameFilter()
{
    $this->getSelect()->group('main_table.name');
    return $this;
}

应用此过滤器:

$this->_totalItems = Mage::getModel('downloads/files')
        ->getCollection()
        ->addFieldToFilter('customer_groups', array('like' => '%'.$customergroupId.'%'))
        ->addFieldToFilter('main_table.is_active', 1)
        ->addGroupByNameFilter()
        ->getSize()

就像一个魅力!这样我就会保留XXXXXXX_Downloads_Model_Mysql4_Files_Collection对象。 :)

干杯,

马亭

答案 1 :(得分:2)

方法" getSize()"当你调用" getSelect()"时,在Varien_Data_Collection上实现在你的收藏中,它会返回一个" Zend_Db_Select"对象,这个没有实现getSize方法。

因此,您可以使用magento在集合中实现getSize的方式,但在Zend_Db_Select中,您不能仅在Zend_Db_select中对集合进行分组。

Magento喜欢这样:

 $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(*)');

明白了吗?

Magento重置所有"重"查询的参数,只需使用" COUNT()"进行查询,但如果您需要使用组,则只有COUNT()会计算您的组,因此您可以模拟使用DISTINCT进行分组结果。