Domanda

Voglio ottenere count dopo il filtro di raccolta per attributi.In realtà voglio filtrare ordinare collezioni by non canceled ,non fraud'e uso getSize() funzione per ottenere il conteggio ma è dato count result come quando any filters not applied.

Suggerisci cosa faccio in this caseper ottenere il risultato corretto del conteggio.Ho ordine 630 e quando uso count() la funzione sul filtro di raccolta dà il risultato corretto.

$orderCollection = Mage::getModel('sales/order')->getCollection();

echo $orderCollection->getSize().'---'; // Result 630
                //$orderCollection->addFieldToFilter('customer_id',$customer->getId());
$orderCollection->addFieldToFilter('state', array('nin' => array('pending_payment', 'canceled', 'fraud', 'payment_review', 'pending', 'pending_paypal', 'closed')));

echo $orderCollection->size(); // result give 630


echo $orderCollection->count(); // given 305  proper result.

Immagino che la funzione load() funzioni per getCount() ecco perché è ok.Ho controllato il link Differenza tra getSize() e count () sulla raccolta

La mia domanda, è il mio concetto è giusto?

È stato utile?

Soluzione

Il tuo problema è che chiami getSize() due volte e si modifica la raccolta tra le chiamate.
Dai un'occhiata a come getSize() opera.

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

Quindi la prima volta che chiami getSize() si ottiene il risultato corretto 630.
Quindi aggiungi un altro filtro alla raccolta e chiama getSize() Ancora.
Ma la prima volta che chiami getSize() il valore è ricordato in $this->_totalRecords.
la seconda volta che la chiami, la query non viene eseguita di nuovo perché $this->_totalRecords non è null e il metodo restituisce solo il valore che hai già impostato, 630 nel tuo caso.

È possibile rimuovere il primo getSize()chiama se non ne hai bisogno.
Se ne hai bisogno puoi farlo:

//clone the collection object
$clone = clone $orderCollection;
//get the total size from the clone
echo $clone->getSize();
//add the filter to the original object
$orderCollection->addFieldToFilter('state', array('nin' => array('pending_payment', 'canceled', 'fraud', 'payment_review', 'pending', 'pending_paypal', 'closed')));
//get the size of the filtered collection
echo $orderCollection->size(); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top