2013-03-11 3 views
9

Это может быть простой вопрос, но я не могу найти ответ. Как я могу узнать, нет ли в моей коллекции данных?Обнаружить, если коллекция содержит данные

Я делаю $datas = Mage::getModel('zzz/zzz')->getCollection(), если я делаю $datas->getData(), он возвращает пустой массив, но откуда я могу узнать, нет ли в моей коллекции данных без выполнения foreach или getData?

ответ

20

Вам следует избегать использования 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()); 
+0

Спасибо за этот очень подробный ответ! Принято ! – Shadowbob

+0

Я действительно хочу отметить этот ответ. или добавить в список в мой профиль, где я могу сохранить ценный ответ, как этот. –

1

Вы можете использовать;

$collection = Mage::getModel('zzz/zzz')->getCollection(); 
var_dump($collection->count()); 
+0

Это сработало! Я не знал, что мы можем рассчитывать. Это большое спасибо. – Shadowbob

+2

@ user1682624, вам следует избегать использования метода 'count()' в вашей коллекции. Я объяснил, почему в моем посте ниже –

4

Вы легко можете просто сделать, если заявление так:

if (!$datas->getData() || empty($datas->getData())) { 
    // do things 
} 
+0

Жаль, что это было то, чего я хотел избежать, я +1 за ответ. Благодарю. – Shadowbob

2

/** * Получить коллекции все элементы подсчета * * @return INT */ $ коллекции = Mage :: getModel ('ааа/ГЭБ') -> getCollection() -> GETSIZE();

Это код, который используется для разбивки на страницы и т. Д. И рекомендуется.

где /** * Retireve Количества коллекционных предметов загружены * * @return INT */ счетчик общественной функции()

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

1

Запуск простой, стандартный PHP count() на сбор в порядке здесь. Пока вы должным образом отфильтровали свою коллекцию, которую вы всегда должны были сделать, прежде чем перейти к точке подсчета, она также вызывает метод ->count() в коллекции.Как только вы каким-либо образом манипулируете коллекцией, он будет загружаться независимо от используемого вами метода, поэтому стандартный PHP count(), вызывающий метод ->count() на объекте, проходящий через коллекцию с помощью foreach(), будет загружать коллекцию в том же как load(), на самом деле, если вы отсканируете метод load() назад, вы увидите, что он действительно запускает стандартный PHP foreach() для загрузки данных коллекции.

Так что неважно, как вы это делаете, вы все равно не можете считать свою коллекцию, пока не знаете, сколько результатов было возвращено из базы данных, поэтому метод выше - это хорошо, но это означает дополнительные вызовы БД, сначала пересчитать, затем загрузить. Лучший способ - просто убедиться, что вы делаете свои SELECT заявлениями как можно более конкретными, сужая их с помощью статей WHERE и т. Д. Если вы тянете выберите объект из коллекции у вас есть доступ ко всем методы Zend_Db_Select показанных here, т.е.

$collection->getSelect()->where('......... = ?', $var);

+0

На самом деле он вернул бы только 1 данные или пустой, поэтому я искал самый быстрый способ сделать это. – Shadowbob

+0

Привет, Джонатан, спасибо за этот ответ. Как вы правильно определили, коллекция будет загружена в конце концов. Единственное: в большинстве случаев мы используем 'getSize' для определения, НАМ НЕОБХОДИМО НАГРУЗИТЬ ЭТО ИЛИ НЕ. Наиболее типичное использование 'getSize' - это проверить: действительно ли наша коллекция содержит объекты, а затем либо идет (если есть), либо останавливает вашу логику от выполнения (поэтому сбор не будет загружен). Помимо этого, Collection может использоваться несколькими различными модулями для его подготовки, поэтому использование 'count' в одном приведет к потере логики другого (см. Панель инструментов каталога) –

0

Пусть коллекция продукта $ pro_collection

Теперь примените следующий код ..

<?php 
if(isset($pro_collection) && count($pro_collection) > 0) { 
    /* Your code here */ 
} 
?> 
1

в дополнение к принятым ответы см ориентиры:

Te STED 750 продуктов

$collection->getData()

  • Итого вкл. Wall Time (microsec): 67 567 микросекунд
  • Всего вкл. ЦП (микросекунды): 67599 микросекунд
  • Всего вкл. MemUse (байты): 11 719 168 байт
  • Всего вкл. PeakMemUse (байт): 11648152 байт
  • Количество вызовов функций: 1,047

$collection->getSize()

  • Всего вкл. Время стены (микросекунда): 6371 микросекунды
  • Всего вкл. CPU (microsecs): 4402 микросекунда
  • Всего вкл. MemUse (байты): 140,816 байт
  • Всего вкл. PeakMemUse (байт): 96000 байт
  • Количество вызовов функций: 191

$collection->count() или sizeof($collection)

  • Всего вкл. Время стены (микросекунда): 2,130,568 микросекунда
  • Всего вкл. ЦП (микросекунды): 2,080,617 микросекунды
  • Всего вкл. MemUse (байты): 12 899 872 байта
  • Всего вкл.PeakMemUse (байт): 13002256 байт
  • Количество вызовов функций: 101.073

Таким образом, вы должны пойти с getSize().


Форма: https://magento.stackexchange.com/questions/179028/how-to-check-if-a-collection-has-items/179035#179035

Смежные вопросы