Magento:如何按类别过滤Mage :: getResourceModel('eav / entity_attribute_collection')的结果

时间:2010-09-01 04:49:06

标签: magento attributes categories

我已使用以下代码获取制造商的完整列表。

    $currentCategory = Mage::registry('current_category');
    $product = Mage::getModel('catalog/product');       
    $attributes = Mage::getResourceModel('eav/entity_attribute_collection')->setEntityTypeFilter($product->getResource()->getTypeId())->addFieldToFilter('attribute_code', 'brand_name');      
    $attribute = $attributes->getFirstItem()->setEntity($product->getResource());       
    $manufacturers = $attribute->getSource()->getAllOptions(false);      

现在,我如何获得属于特定类别的制造商列表?我已经挖了一段时间才找到一种方法来限制一个类别的结果,但没有运气。 ResourceModel可以按类别过滤吗?

感谢。

2 个答案:

答案 0 :(得分:0)

我认为您最好先从该类别中收集一系列产品,然后获取与这些产品相匹配的属性。类似的东西:

$currentCategory = Mage::registry('current_category');
$products = $currentCategory->getProductCollection();
foreach($products as $product):
  $product = Mage::getModel('catalog/product')->load($product->getId());
  $manufacturers[] = $product->getBrandName();      
endforeach;

您需要对数组进行重复数据删除,但array_unique()应该可以为您提供帮助。

HTH, JD

修改

这样可以防止需要加载每个产品,应该提高性能:

$currentCategory = Mage::registry('current_category');
$products = $currentCategory->getProductCollection();
$products->addAttributeToSelect('brand_name');
$products->load();  //execute the query
$manufacturers = $products->toArray(array('brand_name'));

请记住,通过缓存,性能降低只需花费您一次。

JD

答案 1 :(得分:0)

感谢您获取该属性的选项ID的好方法。这对我帮助很大! 以下是我最终要做的选项id及其文本值:

$currentCategory = Mage::registry('current_category');
$products = $currentCategory->getProductCollection();
$products->addAttributeToSelect('brand_name');
$products->load();  //execute the query
$manufacturers = $products->toArray(array('brand_name'));   
$temp = array();
foreach($manufacturers as $v) {
    $temp[] = $v['brand_name'];
}
$brands = implode(",",array_unique($temp));
$write = Mage::getSingleton('core/resource')->getConnection('core_write');
$readresult=$write->query("SELECT eav_attribute_option_value.option_id, eav_attribute_option_value.value FROM eav_attribute_option_value INNER JOIN eav_attribute_option ON eav_attribute_option_value.option_id=eav_attribute_option.option_id WHERE eav_attribute_option.attribute_id=505 AND eav_attribute_option_value.option_id IN (".$brands.")");

while ($row = $readresult->fetch() ) {
    $brandlist[] = array('value'=>$row['option_id'], 'label'=>$row['value']);
}

brandlist数组将具有选项id和value,以便我可以使用它进行链接。

再次感谢。