Агрегатные функции в Magento ORM

#magento

#magento

Вопрос:

Как использовать агрегатные функции, такие как sum(), count() в Magento ORM.

Рассмотрим, что существует таблица «test» со следующими значениями

 
-------------------------------------
productid           |          qty
-------------------------------------
1                   |            2
-------------------------------------
2                   |            3
-------------------------------------
3                   |            5
-------------------------------------
  

и если бы я сопоставил эту таблицу в своем модуле, чтобы я мог получить данные коллекции, такие как

 
$_collection = Mage::getModel('mymodule/customcart')->getCollection();
  

как мне получить результат, эквивалентный приведенному ниже запросу с КОЛЛЕКЦИЕЙ?

 
select sum(qty) from test;
  

Ответ №1:

Если ваша mymodule/customcart коллекция основана на EAV, вы можете использовать addExpressionAttributeToSelect

 $_collection = Mage::getModel('mymodule/customcart')->getCollection();
$_collection->addExpressionAttributeToSelect('qty', 'SUM({{item_qty}})', 'item_qty')
    ->groupByAttribute('productid');
  

В противном случае вам придется работать с SQL более напрямую:

 $_collection = Mage::getModel('mymodule/customcart')->getCollection();
$_collection->getSelect()
    ->columns('SUM(item_qty) AS qty')
    ->group('productid');
  

Будьте осторожны при использовании агрегированных коллекций с сетками или пейджерами. Они полагаются на getSelectCountSql которые плохо обрабатывают сгруппированные запросы, возможно, вам придется предоставить свою собственную getSelectCountSql функцию, которая возвращает точное количество.

Комментарии:

1. @clockworkgeek как я могу попробовать этот запрос в коллекции magento: выберите сумму (кол-во productid — any_other_columns) из теста;

2. @VijayS если вы не можете разобраться с вышесказанным, потому что ваша ситуация отличается, пожалуйста, задайте новый вопрос, возможно, ссылаясь на этот и объясняя, чем он отличается.