长话短说,我需要获得一个应该使用以下条件过滤的集合:其中(A和(B或C)或(D和(E或F))。 我可以单独使用:
$collection = Mage::getModel('customModule/customModel')
->getCollection()
->addFieldToFilter('fieldA', valA)
->addFieldToFilter(
array('fieldB', 'fieldC'),
array(
array('eq' => valB),
array('eq' => valC)
)
);
但我不知道我是否可以制作一个将这两者结合起来的集合。我还没有找到一种“Magento”方式。我也使用
在他们之间进行联合$collection1->getSelect()->union(array($collection2->getSelect()));
但它不起作用。在上述声明之后,打印$ collection1-> getSelect() - > __ toString()会显示:
SELECT `main_table`.*SELECT `main_table`.* FROM `customModel` AS `main_table` WHERE..
会抛出错误。由于某些原因,它连接了两个select子句而不是两个查询。
任何人都可以向任何方向建议修复吗?如果我可以使用Magento的本机函数来执行复杂条件或如何修复联合?
答案 0 :(得分:1)
我也搜索了很多&为此广泛但不幸的是它没有实施。
在没有UNION
的情况下使用DISTINCT
会有一些问题,因为集合中的entity_id
必须是唯一的,否则您将从您的某些代码层中获得异常。< / p>
可以通过获取底层Zend_Select
对象并以Zend方式添加联合连接。这意味着生成的查询对象将是Zend_Query
,您必须执行并获取结果(Zend方式)。
这样做的缺陷是结果不是Magento Collection,而且里面的对象不是Magento
模型对象,而是Zend_Db_Table_Row
。
我创建了多个单独的集合,我调用了getAllIds()
(这会触发一个单独的查询,只会获取ID),然后我合并了生成的id数组并创建了一个“主集合”WHERE entity_id IN(/*...*/)