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() не эффективнее.