Magento - 检索具有特定属性值的产品

在我的块代码中,我试图以编程方式检索具有具有特定值的属性的产品列表。

或者,如果这是不可能的,如何检索所有产品,然后过滤它们以仅列出具有特定属性的产品?

如何使用标准布尔筛选器执行搜索或匹配我的产品子集?ANDOR


答案 1

几乎所有的 Magento 模型都有一个相应的集合对象,可用于获取模型的多个实例。

要实例化产品集合,请执行以下操作

$collection = Mage::getModel('catalog/product')->getCollection();

产品是Magento EAV样式模型,因此您需要添加要返回的任何其他属性。

$collection = Mage::getModel('catalog/product')->getCollection();

//fetch name and orig_price into data
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

有多个语法可用于在集合上设置筛选器。我总是使用下面的详细版本,但您可能希望检查Magento源,以了解可以使用过滤方法的其他方式。

下面演示如何按值范围(大于 AND 小于值)进行筛选

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

//filter for products whose orig_price is greater than (gt) 100
$collection->addFieldToFilter(array(
    array('attribute'=>'orig_price','gt'=>'100'),
)); 

//AND filter for products whose orig_price is less than (lt) 130
$collection->addFieldToFilter(array(
    array('attribute'=>'orig_price','lt'=>'130'),
));

虽然这将按等于一件事或另一件事的名称进行过滤。

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

//filter for products who name is equal (eq) to Widget A, or equal (eq) to Widget B
$collection->addFieldToFilter(array(
    array('attribute'=>'name','eq'=>'Widget A'),
    array('attribute'=>'name','eq'=>'Widget B'),        
));

支持的短条件(eq,lt等)的完整列表可以在_getConditionSqllib/Varien/Data/Collection/Db.php

最后,可以遍历所有 Magento 集合(基集合类在迭代器接口上实现)。这是设置过滤器后获取产品的方式。

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

//filter for products who name is equal (eq) to Widget A, or equal (eq) to Widget B
$collection->addFieldToFilter(array(
    array('attribute'=>'name','eq'=>'Widget A'),
    array('attribute'=>'name','eq'=>'Widget B'),        
));

foreach ($collection as $product) {
    //var_dump($product);
    var_dump($product->getData());
}

答案 2

这是我最初问题的后续工作,以帮助其他有同样问题的其他人。如果需要按属性进行筛选,而不是手动查找 id,则可以使用以下代码来检索属性的所有 id、值对。数据作为数组返回,属性名称作为键。

function getAttributeOptions($attributeName) {
    $product = Mage::getModel('catalog/product');
    $collection = Mage::getResourceModel('eav/entity_attribute_collection')
              ->setEntityTypeFilter($product->getResource()->getTypeId())
              ->addFieldToFilter('attribute_code', $attributeName);

    $_attribute = $collection->getFirstItem()->setEntity($product->getResource());
    $attribute_options  = $_attribute->getSource()->getAllOptions(false);
    foreach($attribute_options as $val) {
        $attrList[$val['label']] = $val['value'];
    }   

    return $attrList;
}

下面是一个函数,可用于按属性集 id 获取产品。使用上一个函数检索。

function getProductsByAttributeSetId($attributeSetId) {
   $products = Mage::getModel('catalog/product')->getCollection();
   $products->addAttributeToFilter('attribute_set_id',$attributeSetId);

   $products->addAttributeToSelect('*');

   $products->load();
   foreach($products as $val) {
     $productsArray[] = $val->getData();
  }

  return $productsArray;
}

推荐