2012-02-22 19 views
7

el uso de modelos de recogida Magentos, ¿cómo debo ir sobre la adición de una consulta parte/filtro como este:colección Magento - filtro por varios campos

WHERE (main_table.x < 1 OR (main_table.x - main_table.y) >= 5) 

actualización ahora estoy corriendo este:

$this->getSelect() 
    ->where('main_table.x < 1') 
    ->orWhere('(main_table.x - main_table.y) >= :qty'); 
$this->addBindParam(':qty', $qty); 

Resultado:

SELECT ... WHERE ... AND ... AND (main_table.x < 1) OR ((main_table.x - main_table.y) >= :qty) ORDER BY ... 

La cuestión es que me parece que no puede llegar a unirse a $qty:qty

Actualización 2 terminé con esto, ya que necesitaba la OR entre paréntesis

$this->getSelect()->where('(main_table.x < 1 OR (main_table.x - main_table.y) >= ?)', $qty); 
+0

He actualizado la publicación – Vitamin

Respuesta

6

Cuando se utiliza la getSelect método que está pasando por alto la interfaz de la colección de modelos de Magento. A veces, esta es la única forma de obtener la consulta de selección exacta que desea, pero tenga en cuenta que puede no estar al 100% con lo que está haciendo la interfaz del modelo de Magento.

Cuando utiliza el método bindParamater está utilizando la interfaz del modelo de Magento. No puedo hablar con por qué no funciona, pero sospecho que el objeto de selección de Zend y los objetos de la colección de modelos de Magento enlazan sus parámetros en diferentes momentos, y de una manera diferente.

Para obtener los resultados que desea, omita el método bindParamater y utilice el parámetro más simple ? que reemplaza el método orWhere.

$this->getSelect() 
    ->where('main_table.x < 1') 
    ->orWhere('(main_table.x - main_table.y) >= ?',$qty); 
+0

Esto funciona perfectamente, gracias! – Vitamin

3

Blockquote La cuestión es que me parece que no puede llegar a unir $ Cant a: Cant

Bueno en realidad no es un problema que es el motor/MySQL manera DOP está trabajando con los parámetros de preparación y vinculación de las declaraciones de consulta, que se envían por separado, y la ejecución de la consulta posterior.

Por lo tanto, no está en el nivel de abstracción de base de datos para generar la instrucción de consulta final, si estás usando Parámetros Bind

ver este stackoverflow question y PDO manual.

+1

Entonces, ¿está diciendo que funciona, solo estoy imprimiendo la consulta antes de que se ejecute y, por lo tanto, obtengo resultados engañosos? – Vitamin

+0

Sí, no verá la cadena de consulta con enlace interpolado que, por supuesto, puede irritar. Para una doble verificación, reduzca su consulta de recopilación mediante sku o ID de producto con param vinculante. – ngocanhdoan

Cuestiones relacionadas