Magento - 检索具有特定属性值的产品
2022-08-30 08:27:12
在我的块代码中,我试图以编程方式检索具有具有特定值的属性的产品列表。
或者,如果这是不可能的,如何检索所有产品,然后过滤它们以仅列出具有特定属性的产品?
如何使用标准布尔筛选器执行搜索或匹配我的产品子集?AND
OR
在我的块代码中,我试图以编程方式检索具有具有特定值的属性的产品列表。
或者,如果这是不可能的,如何检索所有产品,然后过滤它们以仅列出具有特定属性的产品?
如何使用标准布尔筛选器执行搜索或匹配我的产品子集?AND
OR
几乎所有的 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等)的完整列表可以在_getConditionSql
lib/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());
}
这是我最初问题的后续工作,以帮助其他有同样问题的其他人。如果需要按属性进行筛选,而不是手动查找 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;
}