Magento收集复杂条件或联合方法

时间:2014-02-03 11:21:11

标签: magento

长话短说,我需要获得一个应该使用以下条件过滤的集合:其中(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的本机函数来执行复杂条件或如何修复联合?

1 个答案:

答案 0 :(得分:1)

我也搜索了很多&为此广泛但不幸的是它没有实施。

在没有UNION的情况下使用DISTINCT会有一些问题,因为集合中的entity_id必须是唯一的,否则您将从您的某些代码层中获得异常。< / p>

Magento / Zend方式:

可以通过获取底层Zend_Select对象并以Zend方式添加联合连接。这意味着生成的查询对象将是Zend_Query,您必须执行并获取结果(Zend方式)。

这样做的缺陷是结果不是Magento Collection,而且里面的对象不是Magento模型对象,而是Zend_Db_Table_Row

我解决它的方式:

我创建了多个单独的集合,我调用了getAllIds()(这会触发一个单独的查询,只会获取ID),然后我合并了生成的id数组并创建了一个“主集合”WHERE entity_id IN(/*...*/)