【问题标题】:Joining AND conditions with OR condition on Magento在 Magento 上使用 OR 条件加入 AND 条件
【发布时间】:2012-09-19 08:37:19
【问题描述】:

我可以使用 addFieldToFilter 和 addAttributeToFilter 在 Magento 上运行 AND 和 OR 布尔条件。

但是,我很好奇实现如下更复杂的布尔条件:

WHERE (`sku > 5` AND `price` > '10') OR (`name` = 'books')

对于AND条件,我有

$collections = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*')
->addFieldToFilter( 'sku', array('gt' => 5 )
->addFieldToFilter('price', array('gt' => 10);

转换为 WHERE 条件的第一个括号:

(`sku` > 5 AND `price` > 10)

我不知道如何从这里着手来表达 OR 条件

`name` = 'books'

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: magento boolean


    【解决方案1】:

    查看我之前的帖子:

    complex boolean conditions on Magento

    您可以通过传递数组来创建 OR:

    Mage::getModel('catalog/product')
    ->getCollection()
    ->addFieldToFilter('price', array('gt' => 10))
    ->addAttributeToFilter(
        array(
            array('attribute'=>'firstname', 'like'=>'test%'),
            array('attribute'=>'lastname', 'like'=>'test%'),
        )
    )
    

    对 addAttributeToFilter() 的每个附加调用都将进行 AND 运算,但 firstname / lastname 将进行 ORed。

    如果您需要更复杂的选择语句,您始终可以从集合中获取选择对象并对查询进行调整。查看 Varien_Db_Select 的提示:)

    $collection->getSelect()->join(..)->orWhere(..);  // etc
    

    您甚至可以调试查询以查看它是否正常:

    echo $collection->getSelect()->__toString();
    

    【讨论】:

    • 谢谢 Andrew,但那一次是不同的。这次我用括号来强调我的观点:WHERE (sku > 5 AND price > 10) OR (name = books)。但是 WHERE (sku > 5) AND (price > 10 or name = 'books') 是我能做的,基于你和其他人的答案,这是一个不同的答案。
    • 我也看到了这个(和类似的)答案,但它没有回答这个特定的问题。 AND 表达式在括号中,而 OR 是 ORing 不同的字段。我发现的其他答案只提到了对 SAME 字段的不同值进行 ORing。
    • Varien_Db_Select 正是我所需要的。再次感谢安德鲁。
    猜你喜欢
    • 1970-01-01
    • 2016-04-24
    • 2014-11-23
    • 1970-01-01
    • 2013-11-09
    • 2020-12-07
    • 2023-02-04
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多