【问题标题】:Magento collection - filter by several fieldsMagento 集合 - 按多个字段过滤
【发布时间】:2012-03-13 06:29:57
【问题描述】:

使用 Magento 集合模型,我应该如何添加查询部分/过滤器,例如:

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);

【问题讨论】:

    标签: php zend-framework magento php-5.3


    【解决方案1】:

    当你使用 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);
    

    【讨论】:

      【解决方案2】:

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

      这实际上不是问题,它是 PDO/MySQL 引擎处理查询语句准备和绑定参数的方式 - 它们分别提交 - 以及之后的查询执行。

      因此,如果您使用 绑定参数

      ,则生成最终查询语句不在 DB 抽象层上

      请参阅此stackoverflow questionPDO manual

      【讨论】:

      • 所以你说它确实有效,我只是在执行之前打印查询,从而得到误导性结果?
      • 是的,您不会看到带有插值绑定的查询字符串,这当然可能会让人恼火。对于双重检查,请使用绑定参数通过 sku 或产品 ID 减少您的集合查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多