我有一个集合:
$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
答案 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进行分组结果。