Вам следует избегать использования count
или ваших Коллекций. Вот почему:
Mage_Core_Model_Resource_Db_Collection_Abstract
(Collection модель, которая наследуется почти все Magento коллекции) не имеет count()
определен, поэтому использование count
на вашей коллекции вы, скорее всего, в конечном итоге с Varien_Data_Collection::count()
что очень плохой вариант, так как оно делает коллекцию load()
, а затем подсчитывает загруженные объекты:
/**
* Retireve count of collection loaded items
*
* @return int
*/
public function count()
{
$this->load();
return count($this->_items);
}
Имея большую коллекцию (особенно коллекция EAV) сделает результат при загрузке всех данных Collection - это может занять много времени.
Вместо этого вы должны использовать Varien_Data_Collection_Db::getSize()
метод, который будет выполнить запрос SQL, чтобы получить рассчитывать только, гораздо более оптимизирован по сравнению с получением всех видов данных для сбора нагрузки:
/**
* Get collection size
*
* @return int
*/
public function getSize()
{
if (is_null($this->_totalRecords)) {
$sql = $this->getSelectCountSql();
$this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
}
return intval($this->_totalRecords);
}
В дополнении к этому, после того, как load
коллекция не может быть изменена каким-либо образом. Например, вы не сможете применять дополнительные фильтры порядка сортировки изменений в любой момент после использования count()
.
Так правильный ответ должен быть:
$collection = Mage::getModel('zzz/zzz')->getCollection();
var_dump($collection->getSize());
Спасибо за этот очень подробный ответ! Принято ! – Shadowbob
Я действительно хочу отметить этот ответ. или добавить в список в мой профиль, где я могу сохранить ценный ответ, как этот. –