Usando addFieldToFilter do Magento para filtrar por colunas existentes
-
19-08-2019 - |
Pergunta
hipotético. Quero preencher / carregar uma coleção sales/order
com cada ordem onde o grand_total é igual ao total_paid
. Eu sei que eu posso usar addFieldToFilter
para filtrar por um valor específico, mas é possível usar este método para filtrar por outros valores de banco de dados. Se não, há qualquer objeto de acesso de dados no sistema de Magento que permite isso.
$orders = Mage::getModel('sales/order');
$orders = $orders->getCollection();
$orders->addFieldToFilter('total_paid',Array('eq'=>30)); //would find all the orders that were 30
//syntax to find all the orders whose total_paid value is equal to it's grand_total attribute
//????????
O conceito non-eav
SQL Eu estou agarrando para é:
SELECT * FROM Orders o WHERE o.total_paid = o.grand_total
Esta é possível fazer puramente com chamadas de método de objeto, ou que eu preciso para fazer a filtragem de pós-carga?
Como outros sistemas ORM
lidar com isso?
Solução
Eu estava esperando por uma resposta definitiva para isso, mas vendo como nada de vir para cima assim como eu poderia compartilhar o que eu descobri. Tracei addFieldToFilter e, aparentemente, todos os valores que você usa extremidades até citou então você não pode realmente "hack" isso usando o nome de uma coluna. Na verdade eu não vejo nenhuma maneira de fazer isso, pelo menos não dentro desta classe.
Na realidade eu acho que você precisa ir com filtragem pós-carga, pelo menos por agora. Isto, obviamente, é a própria definição de código ineficiente, mas, novamente, se a eficiência computacional era uma prioridade, você não estaria usando Magento em primeiro lugar ...
Outras dicas
Apenas teve que resolver isso em um dos meus projetos e me deparei com esta questão durante a pesquisa para uma melhor resolução. Meus olhares de hackers como esta:
$orders = Mage::getModel('sales/order')->getCollection();
$orders->getSelect()
->where('total_paid=grand_total');
Irrita-me que uma funcionalidade tal básica de bancos de dados é ignorado por ORM do Magento.