Magento集合-按多个字段筛选


Magento collection - filter by several fields

使用Magentos集合模型,我应该如何添加这样的查询部分/过滤器:

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

更新我现在运行这个:

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

结果:

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

问题是我似乎无法将$qty绑定到:qty

更新2我最终得到了这个,因为我需要括号中的OR

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

当您使用getSelect方法时,您通过传递Magento的模型集合接口。有时,这是获得您想要的确切选择查询的唯一方法,但请记住,它可能无法100%与Magento模型界面的功能相结合。

当您使用bindParamater方法时,您使用的是Magento模型界面。我无法解释为什么不起作用,但我怀疑Zend选择对象和Magento模型集合对象在不同的时间以不同的方式绑定它们的参数。

要获得所需的结果,请跳过bindParamater方法,使用更简单的?参数替换orWhere方法。

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

Blockquote问题是我似乎无法将$qty绑定到:qty

事实上,这不是问题——这是PDO/MySQL引擎处理查询语句准备和绑定参数(分别提交)以及随后执行查询的方式。

因此,如果您使用绑定参数,则不需要在DB抽象层上生成最终查询语句

请参阅此stackoverflow问题和PDO手册。