Por que a função getSize() não funciona ao aplicar o filtro
-
12-12-2019 - |
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 case
para 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?
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();