Question

J'ai entendu plusieurs fois que les deux sont les mêmes. Mais je suis face à un problème bizarre, dans la collection de produits du module CatalogSearch, count () retourne le nombre correct de produits tout en getSize () retourne zéro.

Donc, en gros ce que je reçois:

$collection->count(); //correct count
$collection->getSize(); //0

Mais je veux le getSize () pour le nombre correct car il décide de montrer et de produits dans la pagination de la page de recherche ou non. J'utilise Inner Join, Gauche Devenez membre et où la seule condition de la collection d'être plus précis.

Toutes les idées pourquoi je reçois cette question bizarre?

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 montre de collection corriger getSize (), mais si le getSize () est égal à zéro, j'ai enlevé la clause WHERE et ont donné une nouvelle condition WHERE. Après cela, je reçois SQL cru correct ce que je pensais, et en cours d'exécution dans MySQL donne également un ensemble correct d'enregistrements, mais seulement getSize () sur la collecte donne zéro compte.

Donc, fondamentalement, je peux nécessaire de recharger la collection, getSize () prend des vieux comte. Sens?

Était-ce utile?

La solution

La plupart (sinon toutes) les collections s'étendent Varien_Data_Collection_Db. Voici les 2 méthodes de cette classe

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
    }
    return intval($this->_totalRecords);
} 

public function count() //inherited from Varien_Data_Collection
{
    $this->load();
    return count($this->_items);
}

Il y a une différence. Pour getSize() la collection n'est pas chargé. Pour count() il est. En général, les modèles de collecte utilisent la même méthode de getSize() comme ci-dessus et ne remplacent getSelectCountSql().
Dans getSelectCountSql() la limite est remis à zéro afin d'obtenir le nombre total d'enregistrements disponibles pour les filtres de réglage (déclaration de where). Voyez comment les travaux de getSelectCountSql()

public function getSelectCountSql()
{
    $this->_renderFilters();
    $countSelect = clone $this->getSelect();
    $countSelect->reset(Zend_Db_Select::ORDER);
    $countSelect->reset(Zend_Db_Select::LIMIT_COUNT);
    $countSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
    $countSelect->reset(Zend_Db_Select::COLUMNS);
    $countSelect->columns('COUNT(*)');
    return $countSelect;
} 

Autres conseils

Attention. Ceci est correct, mais les méthodes sont écrasées dans Varien_Data_Collection_Db comme décrit par Marius

Il suffit de jeter un oeil sur

// \Varien_Data_Collection::getSize
public function getSize()
{
    $this->load();
    if (is_null($this->_totalRecords)) {
        $this->_totalRecords = count($this->getItems());
    }
    return intval($this->_totalRecords);
}

// \Varien_Data_Collection::count
public function count()
{
    $this->load();
    return count($this->_items);
}

Il devrait à ce niveau bas le même. Les deux méthodes se chargent de la collecte et comptent les points.

UPDATE

Oh je vois un problème: getSize () met en cache les _totalRecords, cela signifie qu'il est pas recalculées. Vérifiez où _totalRecords est réglé?

Cette réponse apparaît dans Google pour « magento getSize mal » et recherches similaires, donc je voudrais ajouter un scénario possible qui pourrait être utile à quelqu'un

Lorsque vous avez une déclaration de groupe dans votre requête et vous faites un

SELECT COUNT(DISTINCT e.entity_id) ... GROUP BY ( at_id_art.value )

Mysql retourne un compte pour chacun des groupes, donc Varien_Data_Collection_Db :: getSize () retourne la mauvaise réponse, c'est parce que cette fonction va chercher la première ligne:

public function getSize()
{
    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
    }
    return intval($this->_totalRecords);
}

Quand il remplit

$this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);

Il sélectionne la première rangée et par conséquent renvoie le total du premier groupe que la taille totale.

Je fini par venir avec ce code pour compter, sur la base des valeurs uniques des attributs dans ma requête.

$select = clone $collection->getSelect();
$group = $select->getPart(Zend_Db_Select::GROUP);
$select->reset(Zend_Db_Select::GROUP)->reset(Zend_Db_Select::COLUMNS)->columns("COUNT(DISTINCT {$group[0]})");
$totalCount = $collection->getConnection()->fetchOne($select);

Juste au cas où vous vous retrouvez ici, il y a une autre solution simple pour essayer:

System -> Index Management

et sélectionnez-les tous (même si elles indiquent « Green, pas réindexation nécessaire » et les forcer à réindexer.

Ceci a résolu mon problème de getSize() vide, ce qui, à son tour, a permis aux demandes de bases de données spéciales et nouveautés pour trouver les produits, remplir le « si » les conditions et rendre correctement.

Quand count($collection) était différent de $collection->getSize() je devais reindex les produits, puis tout a bien fonctionné.

Il y a une différence principale Pour getSize () la collection de produits n'est pas chargé. Pour count () il chargera collection complète de produits. Donc, pour le grand catalogue il est conseillé d'utiliser la fonction de comptage dans une collection.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top