Domanda

Ho sentito molte volte che entrambi sono gli stessi. Ma Sto affrontando un problema strano, nella raccolta di prodotti del modulo CatalogSearch, count () sta tornando conteggio prodotto corretto, mentre getSize () restituisce zero.

Quindi, in sostanza questo è quello che sto ottenendo:

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

Ma voglio il getSize () per avere conteggio corretto in quanto decide se mostrare impaginazione e prodotti nella pagina di ricerca o no. Sto usando Inner Join, Registrazione Sinistra e Dove condizioni solo nella raccolta per essere più precisi.

Tutte le idee perché sto ottenendo questo problema strano?

Grazie

UPDATE:

La mia precedente domanda, Come clonare la collezione in Magento? ho voluto eseguire due operazioni differenti su una collezione. La prima mostra corretta raccolta getSize (), ma poi se l'getSize () è zero, ho rimosso la clausola WHERE e diedero nuova condizione WHERE. Dopo questo, io sono sempre corretta SQL prime quello che mi aspettavo, e in esecuzione in MySQL dà anche una corretta serie di record, ma solo getSize () sulla raccolta sta dando a zero conteggi.

Quindi, in pratica mi potrebbe essere necessario ricaricare la raccolta, come getSize () sta prendendo vecchio conte. Ha senso?

È stato utile?

Soluzione

La maggior parte (se non tutti) le collezioni si estendono Varien_Data_Collection_Db. Qui ci sono i 2 metodi da questa 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);
}

C'è una differenza. Per getSize() la raccolta non viene caricato. Per count() è. Di solito i modelli di raccolta utilizzare lo stesso metodo getSize() come sopra e sostituiscono solo getSelectCountSql().
Nel getSelectCountSql() il limite viene ripristinato al fine di ottenere il numero totale di record disponibili per i filtri impostati (dichiarazione where). Vedere come funziona il 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;
} 

Altri suggerimenti

Fate attenzione. Ciò è corretto, ma i metodi vengono sovrascritti in Varien_Data_Collection_Db come descritto da Marius

Basta dare un'occhiata in

// \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);
}

Così dovrebbe a questo basso livello sia lo stesso. Entrambi i metodi caricano la raccolta e contano gli oggetti.

Aggiorna

Oh vedo un problema: getSize () memorizza nella cache il _totalRecords, questo significa che non viene ricalcolato. Controllare dove _totalRecords è impostato?

questa risposta si presenta in google per "Magento getSize sbagliato" e ricerche simili quindi vorrei aggiungere un possibile scenario che potrebbe essere utile a qualcuno

Quando si dispone di una dichiarazione di gruppo nella vostra interrogazione e si fa un

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

Mysql restituirà un conteggio per ciascuno dei gruppi, in modo Varien_Data_Collection_Db :: getSize () restituirà la risposta sbagliata, questo è perché questa funzione legge la prima riga:

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

Quando si popola

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

Si seleziona la prima riga e restituisce quindi il totale del primo gruppo come dimensione totale.

ho finito per venire con questo codice per contare, in base ai valori unici di attributi nella mia interrogazione.

$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);

Nel caso in cui si finisce qui, c'è un'altra soluzione semplice da provare:

System -> Index Management

e selezionare tutti (anche se stanno indicando "Green, nessuna reindex necessario" e costringerli a reindicizzare.

Questo risolto il mio problema getSize() vuoto, che a sua volta, ha permesso le richieste di database speciali e nuovi per trovare i prodotti, compiere il "se" le condizioni e correttamente il rendering.

Quando count($collection) era diverso da quello $collection->getSize() ho dovuto reindex i prodotti, poi tutto ha funzionato bene.

C'è una differenza principale per getSize () la raccolta del prodotto non è stato caricato. Per count () caricherà tutta la raccolta del prodotto. Quindi, per il grande catalogo non è consigliabile utilizzare la funzione di conteggio in tutte le collezioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top