0

好的,我有一个相当简单的模块正在运行,但是我遇到了一个我无法解决的产品集合问题。这是问题所在:

1)我根据发布的搜索类别加载产品集合:

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ->addStoreFilter(Mage::app()->getStore()->getId())
            ->addAttributeToSelect('*')
            ->addAttributeToFilter('search_category', array('eq' => $data['search_category'])); 

2)我在一个基本函数中使用这个集合来检索属性:

$section = $this->getSections($products);

3) 接下来在代码中,如果发布了另一个值,我会进一步过滤产品集合,这会运行另一个函数。

if($data['section'] != "")
{
    $products->addAttributeToFilter('section', array('eq' => $data['section']));            
    $profile = $this->getProfiles($products);
    echo count($products);
    echo count($products->getIds());
}

基本上进入第二个功能的产品是未经过滤的。如果我在此阶段回显 $products 对象的计数,它会给我产品集合中的原始数量,而不是过滤后的数量。

如果我回显 $products->getIds() 它会给我正确的过滤计数。

我真的不明白为什么这不起作用,我已经详细检查了代码,一切都是正确的。似乎如果我在函数中使用产品集合,则无法进一步过滤。

如果我将过滤器移到第一个函数上方,它可以工作,但它显然给了我想要的结果。

如果有人可以解释这一点,请帮助!

4

1 回答 1

5

您应该检查您的$products集合是否加载在初始化和您尝试向其添加额外过滤器的位置之间的某个位置。

因为在加载集合后,您应用的过滤器不会影响它,因为它们只会影响从数据库获取集合的最终请求,而您的已经加载。

Mage_Catalog_Model_Resource_Product_Collection::getAllIds()我相信您确实拼错了getAllIds()提及$products->getIds())将返回正确的过滤数量,因为它将与集合内的 Select 对象一起操作并向 DB 发出请求,而不是获取已加载项目的 Id。

请记住,诸如基本功能count和语言结构之类foreach()的将触发收集的加载过程。

于 2012-09-12T13:44:59.677 回答