J'ai une méthode d'assistance à Magento qui me demande d'obtenir le nombre de collections non liées. De plus, j'ai besoin de ces informations pour chaque produit dans une catégorie I.E. Pour chaque produit de la vue Liste des produits. Je vais donc potentiellement créer de nombreuses collections à plusieurs reprises au cours de la liste des produits.
Quelle est la méthode la plus efficace pour obtenir le nombre de collections, c'est-à-dire que je n'ai pas besoin de données des modèles, tout simplement combien de modèles Il y a. p>
est-ce simplement: p> ou y a-t-il un moyen plus efficace de le faire? p> p>
5 Réponses :
Très bonne question. D'après ce que j'ai trouvé dans le code source, il s'agit de l'option la plus rapide, même s'il s'agit de ce qui suit dans varien_data_collection: donc il fait sa chose habituelle et va de l'avant tout ce que vous avez spécifié, Tout comme si vous le feriez si vous avez itérisé sur les articles individuels. No Magic SQL Mais: Toute la chose EAV et le constructeur de requêtes de Magento sont très intelligents, cela ne devrait donc pas être que em> gros problème. En outre, je parierais que Magento a toutes sortes de mises en cache. P> Donc en bref: Oui, c'est l'option la plus rapide de compter le nombre de produits dans une collection de produits. STRUT > p> p> Count () Code> Ici. Les seules autres méthodes que j'ai constatées que j'ai trouvé que quelque chose à voir avec les produits de comptage sont
getSelectCountSQL () code> et
getProductCountSselect () code>, mais ils renvoient simplement le code SQL. P>
-1: Ce n'est pas le plus rapide. L'inverse est le cas. Sur les grandes collections, cela bloque simplement PHP en raison de la limite de mémoire, il faut donc à une quantité infinie de plus de temps par rapport à la méthode getiser () code>.
Essayez comme suit:
$collection = Mage::getResourceModel('mymodule/mymodel_collection')->addFieldFilter('myattribute', $value); $collection->count(); //or $collection->getSize();
Pour compter les éléments dans une collection, utilisez la méthode jamais strong> Utilisez le compte PHP Lorsque vous utilisez le nombre getize () code>:
() code> fonction ou le compteur
() code> méthode de la collection comme ceci: p>
. ) Code> Fonction / Méthode, Magento charge tous les éléments de la collection de la base de données. Sur les grandes collections, vous aurez une énorme utilisation de la mémoire et éventuellement des problèmes tels que
Erreur fatale: la taille de la mémoire autorisée de 268435456 octets épuisés (essayé d'allouer 71 octets) code> ... p> p>
Se mettre d'accord! Merci pour la pointe, flozz! N'utilisez jamais de compte (). Lorsque vous travaillez avec des milliers d'articles de collecte, l'utilisation de Count () peut provoquer un crash de votre magasin. J'ai découvert de la dure.
Je signalerais que l'obtention () utilise réellement compter si _totalrecords est null .. lib / varien / data / collection / db.php code>
lib / varien / data / collection.php code >
/** * 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); } so getSize() is not more efficient.
Vous devriez probablement expliquer votre code un peu plus. Quel fichier regardez-vous? Je ne vois pas une fonction comme celle-là dans le dossier de l'application dans la version 1.7.
Désolé, mais c'est un problème clair, veuillez vous reporter aux métriques de performance ci-dessous: Utilisation du nombre (): 2014-07-07T12: 27: 04 + 00: 00 Débogage (7): Temps exécuté: 0.4933660030365 Utilisation de Getize (): 2014-07- 07T12: 28: 56 + 00: 00 Débogage (7): Temps exécuté: 0.22210693359375 Comme vous pouvez le constater, Getsize () est significativement plus efficace.
Prenons un exemple de l'utilisation à l'intérieur d'une boucle (par exemple, vous faites une certaine validation), puis multipliez les 271,3 millisecondes par les itérations de boucle. En dehors d'une boucle, alors oui tu as raison.
Voici le moyen le plus efficace de le faire, en utilisant des méthodes de magentato intégrées: