11
votes

Magento - Méthode la plus efficace pour obtenir une collection compte

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.

est-ce simplement: xxx

ou y a-t-il un moyen plus efficace de le faire?


0 commentaires

5 Réponses :


-14
votes

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: xxx

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 Count () 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 () et getProductCountSselect () , mais ils renvoient simplement le code 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 gros problème. En outre, je parierais que Magento a toutes sortes de mises en cache.

Donc en bref: Oui, c'est l'option la plus rapide de compter le nombre de produits dans une collection de produits.


1 commentaires

-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 () .



1
votes

Essayez comme suit:

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


0 commentaires

72
votes

Pour compter les éléments dans une collection, utilisez la méthode getize () : xxx

jamais Utilisez le compte PHP () fonction ou le compteur () méthode de la collection comme ceci: xxx

Lorsque vous utilisez le nombre . ) 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) ...


2 commentaires

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 lib / varien / data / collection.php



-2
votes
/**
     * 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.

3 commentaires

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.



0
votes

Voici le moyen le plus efficace de le faire, en utilisant des méthodes de magentato intégrées: xxx


0 commentaires