J'ai entendu à plusieurs reprises que les deux sont les mêmes. Mais je suis confronté à un problème étrange: dans la collection de produits du module CatalogSearch, count () renvoie le nombre de produits correct, tandis que getSize () renvoie zéro.
Donc, fondamentalement, voici ce que je reçois:
$collection->count(); //correct count
$collection->getSize(); //0
Mais je veux que getSize () ait un compte correct, car il décide si la pagination et les produits doivent être affichés dans la page de recherche ou non. J'utilise les conditions de jointure interne, de jointure gauche et où uniquement dans la collection pour être plus spécifique.
Des idées pourquoi je reçois ce problème étrange?
Merci
MISE À JOUR:
Ma question précédente, Comment cloner la collection dans Magento? Je voulais effectuer deux opérations différentes sur une collection. La première collection affiche getSize () correct, mais si getSize () vaut zéro, j'ai supprimé la clause WHERE et créé une nouvelle condition WHERE. Après cela, j'obtiens le code SQL brut correct auquel je m'attendais, et son exécution dans MySQL fournit également un ensemble correct d'enregistrements, mais seul getSize () sur la collection donne un décompte nul.
Donc, fondamentalement, il se peut que je doive recharger la collection, car getSize () utilise l’ancien compte. Logique?
la source
getSize()
? Merci!CatalogSearch
module, rien ne remplacegetSize()
ougetSelectCountSql()
. Cela devrait fonctionner par défaut, sauf si vous avez ajouté du code personnalisé. Pouvez-vous publier la façon dont vous construisez la collection?_totalRecords
. Vous pouvez essayer de cloner la collection avant d'appelergetSize()
la collection d'origine. Peut-être que ça va marcher.$sql = $collection->getSelectCountSql(); return $collection->getConnection()->fetchOne($sql);
Faites attention. C'est correct, mais les méthodes sont écrasées
Varien_Data_Collection_Db
comme décrit par Marius.Il suffit de regarder dans
Donc, il devrait être le même à ce niveau bas. Les deux méthodes chargent la collection et comptent les éléments.
MISE À JOUR
Oh, je vois un problème: getSize () met en cache les _totalRecords, cela signifie qu’il n’est pas recalculé. Vérifiez où
_totalRecords
est situé?la source
getSize()
?getSize()
ne charge pas la collection pour les enregistrements provenant de la base de données. Non, sauf si vous substituez la méthode et lui dites de charger la collection.echo count($collection->load()->getItems());
donne le compte correct, mais encore une fois je veuxgetSize()
travailler.Cette réponse apparaît dans Google pour "magento getSize false" et des recherches similaires. J'aimerais donc ajouter un scénario qui pourrait être utile à quelqu'un.
Lorsque vous avez une déclaration de groupe dans votre requête et que vous effectuez une
Mysql retournera un compte pour CHAQUE des groupes, donc Varien_Data_Collection_Db :: getSize () retournera la mauvaise réponse, car cette fonction extrait la première ligne:
Quand il peuplera
Il sélectionne la première ligne et renvoie donc le total du premier groupe comme taille totale.
J'ai fini par trouver ce code à compter, basé sur les valeurs uniques des attributs de ma requête.
la source
Juste au cas où vous vous retrouveriez ici, voici une autre solution simple à essayer:
et sélectionnez-les tous (même s’ils indiquent «Vert, pas de réindexation nécessaire» et forcez-les à se réindexer.
Cela a résolu mon
getSize()
problème vide , ce qui a permis aux demandes de base de données spéciales et nouvelles de trouver les produits, de remplir les conditions du "si" et de les rendre correctement.la source
Quand
count($collection)
était différent de$collection->getSize()
ce que j'avais auxreindex
produits, alors tout a bien fonctionné.la source
Il y a une différence principale pour getSize (), la collection de produits n'est pas chargée. Pour count (), la collection de produits entière sera chargée. Donc, pour les gros catalogues, il n'est pas conseillé d'utiliser la fonction de comptage dans une collection.
la source