Pregunta

Situación hipotética. Quiero completar / cargar una colección sales / order con cada pedido donde el grand_total es igual al total_paid . Sé que puedo usar addFieldToFilter para filtrar por un valor específico, pero ¿es posible usar este método para filtrar por otros valores de la base de datos? Si no, ¿hay algún objeto de acceso a datos en el sistema Magento que lo permita?

$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
//????????

El concepto SQL no eav que estoy buscando es:

SELECT * FROM Orders o WHERE o.total_paid = o.grand_total

¿Es posible hacerlo únicamente con llamadas a métodos de objetos, o necesito hacer un filtrado posterior a la carga?

¿Cómo manejan esto otros sistemas ORM ?

¿Fue útil?

Solución

Estaba esperando una respuesta definitiva a esto, pero como no surgió nada, podría compartir lo que descubrí. Rastreé addFieldToFilter y aparentemente todos los valores que usas terminan entre comillas, por lo que realmente no puedes "hackear" esto usando el nombre de una columna. De hecho, no veo ninguna forma de hacerlo, al menos no dentro de esta clase.

Siendo realistas, creo que deberás utilizar el filtrado posterior a la carga, al menos por ahora. Por supuesto, esta es la definición misma de código ineficiente, pero, de nuevo, si la eficiencia computacional fuera una prioridad, no estaría usando Magento en primer lugar ...

Otros consejos

Solo tuve que abordar esto en uno de mis proyectos y me encontré con esta pregunta mientras buscaba una mejor resolución. Mi truco se ve así:

$orders = Mage::getModel('sales/order')->getCollection();
$orders->getSelect()
       ->where('total_paid=grand_total');

Me molesta que el ORM de Magento pase por alto una funcionalidad tan básica de las bases de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top