我在循环中获取addAttributeToFilter函数时遇到问题,以便在Magento中运行。我在商店中有测试数据,以支持搜索以下所有数据;
$attributeSelections=array( array('size' => 44, 'color' => 67, 'manufacturer' => 17),
array('size' => 43, 'color' => 69, 'manufacturer' => 17),
array('size' => 42, 'color' => 70, 'manufacturer' => 17));
我的代码可以搜索这些组合;
foreach ($attributeSelections as $selection) {
$searcher = Mage::getSingleton('catalogsearch/advanced')->getProductCollection();
foreach ($selection as $k => $v) {
$searcher->addAttributeToFilter("$k", array('eq' => "$v"));
echo "$k: $v<br />";
}
$result=$searcher->getData();
print_r($result);
}
这个循环给出了以下结果(略微消毒以获得快感);
size: 44
color: 67
manufacturer: 17
Array ( [0] => Array ( [entity_id] => 2965 [entity_type_id] => 4 [attribute_set_id] => 28 [type_id] => simple [sku] => 1006-0001 [size] => 44 [color] => 67 [manufacturer] => 17 ) )
size: 43
color: 69
manufacturer: 17
Array ( [0] => Array ( [entity_id] => 2965 [entity_type_id] => 4 [attribute_set_id] => 28 [type_id] => simple [sku] => 1006-0001 [size] => 44 [color] => 67 [manufacturer] => 17 ) )
size: 42
color: 70
manufacturer: 17
Array ( [0] => Array ( [entity_id] => 2965 [entity_type_id] => 4 [attribute_set_id] => 28 [type_id] => simple [sku] => 1006-0001 [size] => 44 [color] => 67 [manufacturer] => 17 ) )
所以我的循环是功能并生成搜索。但是,在循环的第一次迭代中输入addAttributeToFilter的值似乎仍然存储在每次搜索中。 我已经尝试清除我的搜索对象,例如,unset($ searcher)和unset($ result)。我也尝试了magento函数,如getNewEmptyItem(),resetData(),distinct()和clear(),但没有一个具有所需的效果。
基本上我要做的是在我的脚本尝试以编程方式创建具有这些属性组合的产品之前检查重复的产品。属性选择数组可能具有不同的大小,因此需要循环。
如果有人能够解释我的问题,我会非常乐观。
答案 0 :(得分:9)
@matei不幸的是,removeAttributeToSelect实际上并不起作用。我今天发现重置集合的正确方法是:
$searcher->clear()
->getSelect()->reset('where');
这将删除已加载的_items
,并删除集合选择中的所有where
子句。然后,您可以添加新标准和load
集合。
答案 1 :(得分:1)
单身人士的重点是每次都获得相同的对象,因此未设置的$ searcher不起作用。您可以使用
$searcher->removeAttributeToSelect($k)删除每个属性过滤器。
答案 2 :(得分:0)
正如matei所指出的那样,问题在于getSingleton检索同一个对象。我用;
替换了这个声明行$searcher = Mage::getModel('catalogsearch/advanced')->getProductCollection();
它现在可以正常运作。