8
votes

Utilisation de groupe () Breaks GetSelectCountSQL à Magento

Lorsque j'utilise

$countSelect->columns('COUNT(DISTINCT e.entity_id)');


2 commentaires

Pourquoi n'utilisez-vous pas simplement un compte PHP normal () sur la collection renvoyée?


Parce que c'est une chose mysql, pas une chose PHP. Lorsque vous appelez Comptez sur une collection, PHP appelle la fonction qui exécute une requête MySQL.


5 Réponses :


29
votes

J'ai mis à jour le fichier lib / varien / data / collection / db.php pour permettre cela comme je devais le faire fonctionner. Vous devrez garder une trace de ceci pour des mises à niveau, mais cela fonctionne. xxx


7 commentaires

Les classes Varien peuvent être remplacées dans le répertoire app / code / local de la même manière que les classes de mage sont. Utilisez cela au lieu de «garder une piste pour les mises à niveau».


+1 à @Clockworkseek - 4 ans de travail de Magento solide et je ne savais jamais que vous pouviez remplacer lib / varien de l'application / code / local. À votre santé.


Pour clarifier: Copier lib / varien / data / Collection / db.php à l'application / code / local / varien / data / collection / db.php et modifiez-le là-bas.


Cela n'a pas fonctionné pour moi dans Magento 1.5 pour les collections de produits car la méthode est remplacée dans une classe enfant: mage_catalog_model_resource_év_mysql4_product_collection J'ai fait le changement là-bas. Mais je devais aussi faire d'autres changements pour la navigation en couches pour prendre en compte mon nombre de produits réduit.


Il vaut mieux réécrire la classe de collecte qui utilise le groupe par.


Merci, cela a sauvé ma journée! Mais comme l'a dit Steve Robbin, il est bien préférable de simplement mettre cette méthode dans votre propre classe de collecte modèle, car elle s'étend jusqu'à db.php


Est-ce que quelqu'un sait quel est l'équivalent de cela à Magento 2?



0
votes

très bel article Voici quelques modifications que j'ai faites afin de le faire fonctionner pour moi

​​Les modifications suggérées dans DB.PHP ne sont pas nécessaires pour résoudre le groupe par collecte de catalogues. J'ai fait le changement similaire dans Catalogue-> Modèle-> Ressource-> EAV-> MySQL4-> Produit-> Collection.php Voici le code que j'ai ajouté à GetSelectCounttsQL () P>

if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) { $countSelect->reset(Zend_Db_Select::GROUP); }


0 commentaires

0
votes

Je l'ai fait sans toucher les fichiers de base en remplaçant la méthode Getize () de ma collection.

public function getSize()
{
    if (count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) {

        // Create a new collection from ids because we need a fresh select
        $ids = $this->getAllIds();
        $new_coll = Mage::getModel('module_key/model')->getCollection()
                ->addFieldToFilter('id', array('in' => $ids));

        // return the collection size
        return $new_coll->getSize();
    }

    return parent::getSize();
}


0 commentaires

3
votes

Dans certains cas, la méthode d'Eric ne fonctionne pas.

Il est préférable de réécrire la méthode getiser () à xxx


0 commentaires

1
votes

J'ai résolu ceci à l'aide de la fonction ci-dessous:

public function getSize()
{
    return sizeof( $this->getAllIds());
}


0 commentaires