Вопрос

Я много раз слышал, что они оба одинаковы. Но я сталкиваюсь с странной проблемой, в сборе продуктов модуля каталога -исследований, count () возвращает правильное количество продуктов, в то время как getsize () возвращает ноль.

Итак, в основном это то, что я получаю:

$collection->count(); //correct count
$collection->getSize(); //0

Но я хочу, чтобы getsize () имел правильный счет, так как он решает, показывать ли страница и продукты на странице поиска или нет. Я использую внутреннее соединение, левое соединение и где условия только в коллекции, чтобы быть более конкретным.

Есть идеи, почему я получаю эту странную проблему?

Спасибо

ОБНОВИТЬ:

Мой предыдущий вопрос, Как клонировать коллекцию в Magento? Я хотел выполнить две разные операции в одной коллекции. Первая коллекция показывает правильный getSize (), но затем, если getSize () равен нулю, я удалил предложение о том, где было новое, где. После этого я получаю правильный необработанный SQL, что я ожидал, и запуск его в MySQL также дает правильный набор записей, но только getSize () в коллекции дает нулевые показатели.

Так что в основном мне может потребоваться перезагрузить коллекцию, так как getsize () занимает старый подсчет. Имеет смысл?

Это было полезно?

Решение

Большинство (если не все), коллекции расширяются Varien_Data_Collection_Db. Анкет Вот два метода из этого класса

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
    }
    return intval($this->_totalRecords);
} 

public function count() //inherited from Varien_Data_Collection
{
    $this->load();
    return count($this->_items);
}

Есть разница. За getSize() Коллекция не загружена. За count() Это. Обычно модели сбора используют то же самое getSize() метод, как указано выше и только переопределяет getSelectCountSql().
В getSelectCountSql() Лимит сброшен, чтобы получить общее количество записей, доступных для установленных фильтров (where утверждение). Посмотрите, как getSelectCountSql() работает

public function getSelectCountSql()
{
    $this->_renderFilters();
    $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);
    $countSelect->columns('COUNT(*)');
    return $countSelect;
} 

Другие советы

Будь осторожен. Это правильно, но методы перезаписаны в Varien_Data_Collection_Db Как описано Мариусом

Просто загляните в

// \Varien_Data_Collection::getSize
public function getSize()
{
    $this->load();
    if (is_null($this->_totalRecords)) {
        $this->_totalRecords = count($this->getItems());
    }
    return intval($this->_totalRecords);
}

// \Varien_Data_Collection::count
public function count()
{
    $this->load();
    return count($this->_items);
}

Так что на этом низком уровне будет таким же. Оба метода загружают коллекцию и подсчитывают элементы.

ОБНОВИТЬ

О, я вижу проблему: getsize () кэширует _totalrecords, это означает, что это не пересчитано. Проверьте, где _totalRecords установлен?

Этот ответ отображается в Google для «Magento getsize неправильно» и аналогичных поисков, поэтому я хотел бы добавить возможный сценарий, который может быть полезен кому -то

Когда у вас есть групповое заявление в вашем запросе, и вы делаете

SELECT COUNT(DISTINCT e.entity_id) ... GROUP BY ( at_id_art.value )

MySQL вернет счетчик для каждой из групп, поэтому varien_data_collection_db :: getsize () вернет неправильный ответ, это потому, что эта функция получает первую строку:

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
    }
    return intval($this->_totalRecords);
}

Когда это народно

$this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);

Он выбирает первую строку и, следовательно, возвращает общую сумму первой группы в качестве общего размера.

В итоге я придумал этот код, чтобы подсчитать, основываясь на уникальных значениях атрибутов в моем запросе.

$select = clone $collection->getSelect();
$group = $select->getPart(Zend_Db_Select::GROUP);
$select->reset(Zend_Db_Select::GROUP)->reset(Zend_Db_Select::COLUMNS)->columns("COUNT(DISTINCT {$group[0]})");
$totalCount = $collection->getConnection()->fetchOne($select);

На случай, если вы окажетесь здесь, есть еще одно простое исправление, чтобы попробовать:

System -> Index Management

и выберите их все (даже если они указывают «зеленый, нет необходимости повторного индекса» и заставляют их реиндекс.

Это решило мой пустой getSize() Проблема, которая, в свою очередь, позволила специальным и новым запросам базы данных найти продукты, выполнить условия «если» и правильно отображать.

Когда count($collection) отличался от $collection->getSize() Мне пришлось reindex Продукты, тогда все работало нормально.

Существует основное отличие для getSize (). Сбор продуктов не загружена. Для count () он загрузит целый сбор продукта. Таким образом, для большого каталога не рекомендуется использовать функцию счета в любой коллекции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top