Pergunta

Quero obter a contagem após o filtro da coleção por atributos. Na verdade, quero filtrar as coleções de ordem by non canceled ,non fraud' E use getSize() função para obter a contagem, mas é dada count result como quando any filters not applied.

Por favor, sugira o que eu faço in this casepara obter o resultado adequado da contagem. Tenho o pedido 630 e quando uso count() função no filtro de coleta dá o resultado adequado.

$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.

Eu acho que a função load() está funcionando para getCount() é por isso que está tudo bem.Eu verifiquei o link Diferença entre getSize() e count() na coleção

Minha pergunta, meu conceito está certo?

Foi útil?

Solução

Seu problema é que você liga getSize() duas vezes e você modifica a coleção entre as chamadas.
Dê uma olhada em como getSize() funciona.

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

Então, a primeira vez que você ligar getSize() você obtém o resultado correto 630.
Então você adiciona outro filtro à coleção e chama getSize() de novo.
Mas a primeira vez que você liga getSize() o valor é lembrado em $this->_totalRecords.
na segunda vez que você a chama, a consulta não é executada novamente porque $this->_totalRecords não é nulo e o método apenas retorna o valor que você já definiu, 630 no seu caso.

Você pode remover o primeiro getSize()ligue se não precisar.
Se precisar, você pode fazer isso:

//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(); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top