2012-07-10 9 views
10

Mam metodę pomocy w Magento, która wymaga ode mnie obliczenia kilku niepowiązanych kolekcji. Ponadto potrzebuję tych informacji dla każdego produktu w kategorii tj. Dla każdego produktu w widoku listy produktów. Więc potencjalnie będę tworzyć wiele kolekcji wielokrotnie podczas renderowania listy produktów.Magento - Najbardziej efektywna metoda uzyskania licznika kolekcji

Jaka jest najskuteczniejsza metoda uzyskania liczby zbiorów, to znaczy, że nie potrzebuję żadnych danych z modeli, po prostu ile modeli tam jest.

Czy to po prostu:

Mage::getResourceModel('mymodule/mymodel_collection')->addFilter('myattribute', $value)->count() 

Czy jest tam bardziej efektywny sposób to zrobić?

Odpowiedz

-13

Bardzo dobre pytanie. Z tego co znalazłem w kodzie źródłowym, jest to najszybsza opcja, mimo że wykonuje następujące operacje w Varien_Data_Collection:

public function count() 
{ 
    $this->load(); 
    return count($this->_items); 
} 

Więc to robi jego normalna rzecz i idzie do przodu i mnóstwo cokolwiek określone, tak jak miałoby to jeśli wykonałeś iterację nad poszczególnymi przedmiotami. Nie ma tutaj żadnej magicznej instrukcji SQL COUNT(). Jedyne inne metody, które znalazłem, mają coś wspólnego z liczeniem produktów: getSelectCountSql() i getProductCountSelect(), ale po prostu zwracają kod SQL.

Ale: cała sprawa EAV i Magento kreator zapytań są bardzo inteligentne, więc nie powinno być że wielkiego. Założę się, że Magento ma wszystkie rodzaje buforowania.

Krótko mówiąc: jest to najszybszy sposób policzenia liczby produktów w kolekcji produktów.

+5

-1: To nie jest najszybszy. Jest odwrotnie. W dużych kolekcjach po prostu psuje PHP z powodu limitu pamięci, więc zajmuje nieskończoną ilość więcej czasu w porównaniu z metodą getSize(). – hakre

1

Spróbuj jak:

$collection = Mage::getResourceModel('mymodule/mymodel_collection')->addFieldFilter('myattribute', $value); 
$collection->count(); 
//or 
$collection->getSize(); 
64

Dla zliczania elementów w kolekcji, należy użyć metody getSize():

$collection->getSize(); 

Nigdy użyć funkcji php count() lub metodę count() kolekcji podobnego to:

count($collection) 
$collection->count() 

Podczas korzystania z funkcji/metody count(), Magento ładuje wszystkie elementy kolekcji z bazy danych. Na dużych zbiorów będzie mieć ogromne zużycie pamięci i ewentualnie kwestie jak Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 71 bytes) ...

+1

Zgadzam się! Dzięki za podpowiedź, FLOZz! Nigdy nie używaj count(). Podczas pracy z tysiącami przedmiotów w kolekcji użycie count() może spowodować awarię twojego sklepu. Dowiedziałem się na własnej skórze ... – awaage

+0

ładne wskazówki FLOZz –

-1
/** 
    * 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); 
    } 

tak getSize() nie jest bardziej efektywne.

+1

Powinieneś prawdopodobnie wyjaśnić swój kod nieco więcej. Jakiego pliku szukasz? Nie widzę takiej funkcji w dowolnym miejscu w folderze aplikacji w wersji 1.7. –

+1

Niestety ale to jest bzdura, proszę zobaczyć poniższe wskaźniki wydajności: Korzystanie count(): 2014-07-07T12: 27: 04 + 00: 00 DEBUG (7): Czas wykonywany: ,4933660030365 Korzystanie getSize (): 2014-07-07T12: 28: 56 + 00: 00 DEBUG (7): Czas wykonany: 0.22210693359375 Jak widać, getSize() jest znacznie bardziej efektywny. – evensis

+0

'public function getSize() {...; $ this -> _ totalRecords = $ this-> getConnection() -> fetchOne ($ sql, $ this -> _ bindParams); ...; return intval ($ this -> _ totalRecords); } ' nie wiem skąd masz swój kod, ale jest to kod, który jest używany dla większości rzeczy w' lib/Varien/Data/Collection/Db.php', i jest to jedna liczba '' '' '' 'select count (. ..) z ...; 'zapytanie, więc oczywiście szybciej. – user3338098

0

Oto najbardziej skuteczny sposób to zrobić, za pomocą wbudowanego w metodach 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)); 
Powiązane problemy