Magento - Самый эффективный метод получения счета коллекции
У меня есть вспомогательный метод в Magento, который требует, чтобы я получил подсчет нескольких несвязанных коллекций. Кроме того, мне нужна эта информация для каждого продукта в категории i.e для каждого продукта в представлении списка продуктов. Поэтому я буду потенциально создавать множество коллекций повторно во время рендеринга списка продуктов.
Каков наиболее эффективный метод получения подсчета коллекции, т.е. мне не нужны какие-либо данные из моделей, просто сколько моделей существует.
Это просто:
Mage::getResourceModel('mymodule/mymodel_collection')->addFilter('myattribute', $value)->count()
Или есть более эффективный способ сделать это?
Ответы
Ответ 1
Очень хороший вопрос. Из того, что я нашел в исходном коде, это самый быстрый вариант, хотя он и делает в Varien_Data_Collection следующее:
public function count()
{
$this->load();
return count($this->_items);
}
Таким образом, он выполняет свою обычную вещь и продвигается вперед и загружает все, что вы указали, точно так же, как если бы вы повторяли отдельные элементы. Здесь нет волшебства SQL COUNT()
. Единственные другие методы, которые я нашел, которые связаны с подсчетом продуктов, - это getSelectCountSql()
и getProductCountSelect()
, но они просто возвращают код SQL.
Но: вся вещь EAV и построитель запросов Magento очень умны, так что это не должно быть большой сделки. Кроме того, я бы поспорил, что Magento имеет все виды кэширования.
Короче: да, это самый быстрый вариант для подсчета количества продуктов в коллекции продуктов.
Ответ 2
Для подсчета элементов в коллекции используйте метод getSize()
:
$collection->getSize();
Никогда используйте функцию php count()
или метод count()
коллекции следующим образом:
count($collection)
$collection->count()
Когда вы используете функцию/метод count()
, Magento загружает все элементы коллекции из базы данных. В больших коллекциях у вас будет огромное использование памяти и, возможно, проблемы, такие как Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 71 bytes)
...
Ответ 3
Попробуйте как:
$collection = Mage::getResourceModel('mymodule/mymodel_collection')->addFieldFilter('myattribute', $value);
$collection->count();
//or
$collection->getSize();
Ответ 4
Вот наиболее эффективный способ сделать это, используя встроенные методы Magento:
$ids = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('entity_id')
->addFieldToFilter('status', array('eq'=>'1'))
->addFieldToFilter('visibility', array('eq'=>'4'))
->addFieldToFilter('type_id', array('in'=>array('simple')))
->getAllIds();
var_dump(count($ids));
Ответ 5
/**
* Retrieve collection all items count
*
* @return int
*/
public function getSize()
{
$this->load();
if (is_null($this->_totalRecords)) {
$this->_totalRecords = count($this->getItems());
}
return intval($this->_totalRecords);
}
поэтому getSize() не эффективнее.