2013-03-11 12 views
9

Es kann eine einfache Frage sein, aber ich kann die Antwort nicht finden. Woher weiß ich, ob meine Sammlung keine Daten enthält?Erkennen, ob Sammlung Daten enthält

Ich mache $datas = Mage::getModel('zzz/zzz')->getCollection() Wenn ich eine $datas->getData() mache, gibt es ein leeres Array zurück, aber woher weiß ich, ob meine Sammlung keine Daten hat, ohne foreach oder getData zu machen?

Antwort

20

Sie sollten vermeiden, count oder Ihre Sammlungen zu verwenden. Hier ist der Grund:

das Mage_Core_Model_Resource_Db_Collection_Abstract (Sammlung Modell, das von fast allen Magento Kollektionen vererbt wird) nicht count() definiert hat, so count auf Ihrer Sammlung mit werden Sie wahrscheinlich mit Varien_Data_Collection::count() am Ende, die sehr schlechte Wahl, da es load() tut eine Sammlung und zählt dann die geladenen Objekte:

/** 
* Retireve count of collection loaded items 
* 
* @return int 
*/ 
public function count() 
{ 
    $this->load(); 
    return count($this->_items); 
} 

eine große Sammlung zu haben (vor allem EAV-Sammlung) wird Ergebnis beim Laden alle Ihre Sammlung Daten machen - dies viel Zeit in Anspruch nehmen kann.

Stattdessen sollten Sie Varien_Data_Collection_Db::getSize() Methode verwenden, die die SQL-Abfrage wird nur ausgeführt bekommen zählen, viel mehr optimiert im Vergleich zu alle Arten von Daten für die Sammlung Last Abrufen:

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

Zusätzlich zu, dass nach load Sammlung kann in keiner Weise verändert werden. Zum Beispiel können Sie nach der Verwendung von count() keine weiteren Filter der Sortierreihenfolge anwenden.

So richtige Antwort sollte sein:

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

Danke für diese sehr detaillierte Antwort! Akzeptiert! – Shadowbob

+0

Ich möchte wirklich diese Antwort zu einem Lesezeichen hinzufügen. oder zur Liste hinzufügen, auf meinem Profil, wo ich die wertvolle Antwort wie diese behalten kann. –

1

können Sie verwenden;

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

Es hat funktioniert! Ich wusste nicht, dass wir zählen können. Das ist großartig Danke. – Shadowbob

+2

@ user1682624, sollten Sie vermeiden, 'count()' Methode mit Ihrer Sammlung zu verwenden. Ich erklärte warum in meinem Beitrag unter –

4

Sie können ganz einfach tun, nur eine if-Anweisung wie folgt:

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

Sorry das war die Art von Dingen, die ich vermeiden wollte, ich +1 für die Antwort. Vielen Dank. – Shadowbob

2

/** * abrufen Sammlung alle Elemente zählen * * @return int */ $ collection = Mage :: getModel ('aaa/bbb') -> getCollection() -> getSize();

Dies ist der Code, der in Paginierung usw. verwendet wird und wird empfohlen.

wo /** * retireve Anzahl der Sammlung geladen Artikel * * @return int */ public function count()

nützlich sein wird für geladene Gegenstände Daten zu überprüfen.

1

einen einfachen, Standard PHP count() auf der Sammlung laufen zu lassen ist hier in Ordnung. Solange Sie Ihre Sammlung richtig gefiltert haben, was Sie immer getan haben sollten, bevor Sie zum Punkt des Zählens gehen, ist das Anrufen der ->count() Methode für eine Sammlung auch in Ordnung.Sobald Sie die Sammlung in irgendeiner Weise manipulieren, wird es unabhängig von der verwendeten Methode geladen, so dass ein Standard-PHP count(), das die ->count()-Methode für das Objekt aufruft, die Sammlung mit einem foreach() durchläuft, alle die Sammlung in demselben laden so wie load(), in der Tat, wenn Sie die load() Methode zurückverfolgen, werden Sie sehen, es tatsächlich ein Standard-PHP foreach() zum Laden von Sammeldaten ausgeführt.

So ist es egal, wie Sie es tun, Sie können Ihre Sammlung immer noch nicht zählen, bis Sie wissen, wie viele Ergebnisse von der Datenbank zurückgegeben wurden, also die obige Methode ist in Ordnung, aber bedeutet zusätzliche DB-Aufrufe, zuerst zählen, dann laden. Eine bessere Methode ist nur sicherzustellen, dass Sie Ihre SELECT Anweisungen so spezifisch wie möglich machen, indem Sie sie mit WHERE Klauseln und so weiter eingrenzen. Wenn Sie das Objekt auswählen aus einer Sammlung ziehen haben Sie Zugriff auf alle der Zend_Db_Select Methoden gezeigt here, dh

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

+0

Eigentlich hätte es nur 1 Daten zurückgegeben oder leer, also habe ich nach dem schnellsten Weg gesucht. – Shadowbob

+0

Hallo Jonathan, danke für diese Antwort. Wie Sie richtig erkannt haben, wird die Sammlung eventuell geladen. Die einzige Sache ist: Die meiste Zeit benutzen wir 'getSize', um zu identifizieren, DO WIR WIRKLICH ES BENÖTIGEN ODER NICHT LADEN MÜSSEN. Die gebräuchlichste Verwendung von 'getSize' - ist zu überprüfen: Enthält unsere Sammlung tatsächlich Objekte und dann entweder (falls dies der Fall ist) oder stoppen Sie Ihre Logik vor der Ausführung (so dass die Sammlung nicht geladen wird). Abgesehen davon kann Collection von wenigen verschiedenen Modulen verwendet werden, um es vorzubereiten, so dass die Verwendung von "count" in einem die Logik des anderen bricht (siehe Katalogsymbolleiste). –

0

die Produktsammlung Angenommen ist pro_collection $

nun den folgenden Code anwenden ..

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

Zusätzlich zu den akzeptierten Antworten siehe Benchmarks:

Te sted für 750 Produkte

$collection->getData()

  • Gesamt Incl. Wandzeit (Mikrosekunden): 67.567 Mikrosekunden
  • Insgesamt Inkl. CPU (Mikrosekunden): 67.599 Mikrosekunden
  • Insgesamt Inkl. MemUse (Bytes): 11.719.168 Bytes
  • Insgesamt Inkl. PeakMemUse (Bytes): 11.648.152 Bytes
  • Anzahl der Funktionsaufrufe: 1.047

$collection->getSize()

  • Gesamt Incl. Wandzeit (Mikrosekunden): 6.371 Mikrosekunden
  • Insgesamt Inkl. CPU (Mikrosekunden): 4.402 Mikrosekunden
  • Gesamt Inkl. MemUse (Bytes): 140.816 Bytes
  • Gesamt Inkl. PeakMemUse (Bytes): 96.000 Bytes
  • Anzahl der Funktionsaufrufe: 191

$collection->count() oder sizeof($collection)

  • Gesamt Incl. Wandzeit (Mikrosekunden): 2.130.568 Mikrosekunden
  • Insgesamt Inkl. CPU (Mikrosekunden): 2.080.617 Mikrosekunden
  • Insgesamt Inkl. MemUse (Bytes): 12.899.872 Bytes
  • Gesamt Inkl.PeakMemUse (Bytes): 13.002.256 Bytes
  • Anzahl der Funktionsaufrufe: 101.073

So sollten Sie mit getSize() gehen.


Form: https://magento.stackexchange.com/questions/179028/how-to-check-if-a-collection-has-items/179035#179035