11
votes

Détecter si la collection contient des données

Il peut être une question simple, mais je ne peux pas trouver la réponse. Comment puis-je savoir si ma collection n'a pas de données?

Je fais $ = données Mage :: getModel ( 'zzz / zzz') -> getCollection () si je fais un $ datas-> getData () il retourne un tableau vide, mais comment puis-je savoir si ma collection n'a pas de données sans faire foreach ou getData?


0 commentaires

7 Réponses :


1
votes

Vous pouvez utiliser;

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


2 commentaires

Ça a marché ! Je ne savais pas que nous pourrions compter. C'est génial merci.


@ user1682624, vous devez éviter d'utiliser compteur () avec votre collection. J'ai expliqué pourquoi dans mon post ci-dessous



4
votes

Vous pouvez facilement simplement faire une déclaration IF comme SO:

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


1 commentaires

Désolé, c'était le genre de choses que je voulais éviter, i +1 pour la réponse. Merci.



2
votes

/ ** * Récupérer la collecte Tous les articles comptent * * @return int * / $ Collection = mage :: getmodel ('aaa / bbb') -> getcollection () -> getiser ();

Ceci est le code utilisé dans la pagination, etc. et est recommandé.

où / ** * Retirerve Count of Collection Articles chargés * * @return int * / Compte de la fonction publique ()

sera utile pour vérifier les données d'éléments chargés.


0 commentaires

22
votes

Vous devez éviter d'utiliser compter ou vos collections. Voici pourquoi:

Le mage_core_model_resource_db_collection_abstract (modèle de collecte héritée par presque toutes les collections de Magento) n'a pas compteur () défini, donc en utilisant compte sur votre collection, vous vous retrouverez probablement avec varien_data_collection :: comptage () qui est une très mauvaise option, car il s'agit d'une collection charge () puis compte Les objets chargés: xxx

Avoir une grande collection (en particulier la collection EAV) permettra de charger toutes vos données de collecte - cela peut prendre beaucoup de temps.

à la place, vous devriez utiliser varien_data_collection_db :: getize () méthode, qui exécutera la requête SQL pour obtenir le compte uniquement, beaucoup plus optimisée par rapport à la récupération de toutes sortes de données pour la charge de collecte: xxx

en plus de celui-ci, après que charge ne peut être modifié de quelque manière que ce soit. Par exemple, vous ne pourrez pas appliquer des filtres supplémentaires d'ordre de tri de changement à un moment donné après l'utilisation de Count () .

La réponse si correcte devrait être la suivante: < Pré> xxx


3 commentaires

Merci pour cette réponse très détaillée! Accepté!


Je veux vraiment avoir signet cette réponse. Ou ajouter à la liste, sur mon profil, où je peux garder la réponse précieuse comme celle-ci.


Pour faire des choses en dehors du modèle lui-même, $ Collection-> articles travail? Serait-ce $ Collection-> getItems () ?



1
votes

Exécution d'un nombre simple, standard PHP () sur la collection va bien ici. Tant que vous avez correctement filtré votre collection, vous devez toujours avoir fait avant d'arriver au point de compter appeler la méthode -> comptez (code> sur une collection convient également. Dès que vous manipulez la collection de quelque manière que ce soit, il sera chargé quelle que soit la méthode que vous utilisez, de sorte qu'un compte php standard () , appelant le -> comptez () méthode sur l'objet, en cours d'exécution à travers la collection avec un foreach () chargera toutes la collection de la même manière que comme charger () , en fait si vous tracez le < Code> Charger () Méthode de retour, vous verrez qu'il exécute en réalité une standard PHP foreach () pour charger les données de collecte.

Donc, peu importe la façon dont vous le faites, vous ne pouvez toujours pas compter votre collection avant de savoir combien de résultats ont été renvoyés de la base de données, la méthode ci-dessus est correcte, mais signifie des appels de dB supplémentaires, d'abord compter, alors à charger. Une meilleure méthode est simplement de vous assurer que vous apportez votre Sélectionnez les instructions aussi précis que possible en les rétrécissant avec clauses et ainsi de suite. Si vous tirez l'objet Select à partir d'une collection, vous avez accès à toutes les méthodes Zend_DB_Select indiquées sur ici , c'est-à-dire

$ Collection-> GetSelect () -> où ('......... =?', $ var);


2 commentaires

En réalité, cela n'aurait été retourné que 1 données ou vide, alors je cherchais le moyen le plus rapide de le faire.


Salut Jonathan, merci pour cette réponse. Comme vous l'identifiez correctement, la collection sera éventuellement chargée. La seule chose est la plus grande partie du temps que nous utilisons getiser pour identifier, avons-nous besoin de le charger ou non. L'utilisation la plus typique de getiser - est de vérifier: notre collection contient-elle réellement des objets, puis procédez à (si elle le fait) ou d'arrêter votre logique de l'exécution (la collection ne sera donc pas chargée). En plus de cela, la collection peut être utilisée par peu de modules différents pour la préparer, il est donc possible d'utiliser compteur dans une logique de l'autre (regarder la barre d'outils de catalogue)



0
votes

Supposons que la collection de produits est $ pro_collection

Appliquez maintenant le code suivant .. xxx


0 commentaires

3
votes

En plus des réponses acceptées, voir référence:

Testé pour 750 produits

$ Collection-> getdata ()

  • total incl. Heure du mur (microsec): 67 567 microsecs
  • total incl. CPU (microsecs): 67 599 microsecs
  • total incl. MEMUS (octets): 11 719 168 octets
  • total incl. PeakMemuse (octets): 11.648.152 octets
  • Nombre d'appels de fonction: 1 047

    $ Collection-> getiser ()

    • total incl. Heure du mur (microsec): 6 371 microsecs
    • total incl. CPU (microsecs): 4 402 microsecs
    • total incl. MEMUS (octets): 140,816 octets
    • total incl. PeakMemuse (octets): 96 000 octets
    • Nombre d'appels de fonction: 191

      $ Collection-> comptez () ou Tailleof ($ Collection)


0 commentaires