Ich habe oft gehört, dass beide gleich sind. Ich habe jedoch ein seltsames Problem: In der Produktsammlung des CatalogSearch-Moduls gibt count () die korrekte Produktanzahl zurück, während getSize () null zurückgibt.
Im Grunde ist es das, was ich bekomme:
$collection->count(); //correct count
$collection->getSize(); //0
Ich möchte aber, dass getSize () die richtige Anzahl hat, da es entscheidet, ob Paginierung und Produkte auf der Suchseite angezeigt werden oder nicht. Ich verwende Inner Join, Left Join und Where Bedingung nur in der Sammlung, um genauer zu sein.
Irgendwelche Ideen, warum ich dieses seltsame Problem bekomme?
Vielen Dank
AKTUALISIEREN:
Meine vorherige Frage: Wie klone ich die Sammlung in Magento? Ich wollte zwei verschiedene Vorgänge für eine Sammlung ausführen. Die erste Auflistung zeigt das korrekte getSize (), aber wenn das getSize () null ist, habe ich die WHERE-Klausel entfernt und die neue WHERE-Bedingung angegeben. Danach erhalte ich korrektes unformatiertes SQL, was ich erwartet habe, und wenn ich es in MySQL starte, werden auch die richtigen Datensätze angezeigt, aber nur getSize () in der Auflistung gibt null Zähler an.
Im Grunde muss ich die Sammlung möglicherweise neu laden, da getSize () die alte Zählung annimmt. Macht Sinn?
quelle
getSize()
? Vielen Dank!CatalogSearch
Modul gibt es nichts, was übersteuertgetSize()
odergetSelectCountSql()
. Es sollte standardmäßig funktionieren, es sei denn, Sie haben benutzerdefinierten Code hinzugefügt. Können Sie die Art und Weise, wie Sie die Sammlung erstellen, veröffentlichen?_totalRecords
. Sie können versuchen, die Sammlung zu klonen, bevor SiegetSize()
die ursprüngliche Sammlung aufrufen . Vielleicht klappt das ja.$sql = $collection->getSelectCountSql(); return $collection->getConnection()->fetchOne($sql);
Achtung. Das ist richtig, aber die Methoden werden
Varien_Data_Collection_Db
wie von Marius beschrieben überschriebenSchauen Sie doch mal rein
Also sollte es auf diesem niedrigen Niveau dasselbe sein. Beide Methoden laden die Auflistung und zählen die Elemente.
AKTUALISIEREN
Oh, ich sehe ein Problem: getSize () speichert die _totalRecords zwischen, dies bedeutet, dass sie nicht neu berechnet werden. Überprüfen Sie, wo
_totalRecords
eingestellt ist?quelle
getSize()
?getSize()
lädt die Sammlung für Datensätze, die aus der Datenbank stammen, nicht. Es sei denn, Sie überschreiben die Methode und weisen sie an, die Sammlung zu laden.echo count($collection->load()->getItems());
gibt richtige Zählung, aber ich willgetSize()
wieder arbeiten.Diese Antwort wird in Google nach "magento getSize wrong" und ähnlichen Suchanfragen angezeigt. Daher möchte ich ein mögliches Szenario hinzufügen, das für jemanden nützlich sein könnte
Wenn Sie eine Gruppenanweisung in Ihrer Abfrage haben und eine
Mysql gibt eine Anzahl für JEDE der Gruppen zurück, also gibt Varien_Data_Collection_Db :: getSize () die falsche Antwort zurück. Dies liegt daran, dass diese Funktion die erste Zeile abruft:
Wenn es bevölkert
Es wählt die erste Zeile aus und gibt daher die Gesamtsumme der ersten Gruppe als Gesamtgröße zurück.
Am Ende habe ich mir diesen Code ausgedacht, um ihn zu zählen, basierend auf den eindeutigen Werten der Attribute in meiner Abfrage.
quelle
Für den Fall, dass Sie hier landen, gibt es eine weitere einfache Lösung:
und wählen Sie sie alle aus (auch wenn sie "Grün, keine Neuindizierung erforderlich" anzeigen) und zwingen Sie sie, neu zu indizieren.
Dies löste mein leeres
getSize()
Problem, das es den speziellen und neuen Datenbankanforderungen ermöglichte, die Produkte zu finden, die "Wenn" -Bedingungen zu erfüllen und richtig zu rendern.quelle
Wann
count($collection)
war anders als$collection->getSize()
ich zureindex
den Produkten, dann hat alles gut funktioniert.quelle
Es gibt einen Hauptunterschied Für getSize () wird die Produktkollektion nicht geladen. Für count () wird die gesamte Produktkollektion geladen. Für große Kataloge ist es daher nicht ratsam, die Zählfunktion in einer Sammlung zu verwenden.
quelle