Magento:获取自定义属性值而不加载整个产品

时间:2013-10-15 11:11:56

标签: magento

目前我使用它来获取自定义属性值:

$_item = $this->getProduct()->getId();
$_product = $_product = Mage::getModel('catalog/product')->load($_item);  
$optionvalue = $_product->getCustomAttributeValue();
echo $optionvalue;

我想知道是否有更简单的方法可以在不加载整个产品的情况下获得此自定义值?

5 个答案:

答案 0 :(得分:36)

这取决于您运行的Magento版本。不同的版本有不同的产品。如果你正在运行Community Edition 1.6+,那么Catalog模块有一个非常好的方法只为你

尝试以下方法:

$_item = $this->getProduct()->getId();
$_resource = $this->getProduct()->getResource();
$optionValue = $_resource->getAttributeRawValue($_item, 'custom_attribute_value', Mage::app()->getStore());
echo $optionvalue;

如果你有兴趣,你可以潜入Mage_Catalog_Model_Resource_Abstract看看这个小家伙在做什么。它本质上只是一个查询(当然是一个相当复杂的查询,因为EAV倾向于)来检索您要求的一个属性(或者您要求的多个属性,因为您也可以传递数组)。

答案 1 :(得分:31)

我只想提高@JMTyler的答案,因为我发现你不需要真正的产品型号来获得getResource()

所以你可以只使用产品ID并使用单例(如果你在循环中这样做会更好,所以你实际上并没有多次创建模型)

$product_id = 10075;
$_resource = Mage::getSingleton('catalog/product')->getResource();
$optionValue = $_resource->getAttributeRawValue($product_id,  [ATTRIBUTE_ID/ATTRIBUTE_CODE], Mage::app()->getStore());
echo $optionValue;

答案 2 :(得分:13)

其他简单的方法是添加这个" custom_attribute"在从报价项检查产品数据时默认获取的属性列表。

如果您已在config.xml中创建了自定义模块,请添加此项。

<global>
    ...
    <sales>
        <quote>
            <item>
                <product_attributes>
                    <custom_attribute />
                </product_attributes>
            </item>
        </quote>
    </sales>
    ...
</global>

答案 3 :(得分:6)

如果有任何性能优势,这可能不会提供太多;但是,它只会获取属性值而不会获取其他列:

$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToFilter('entity_id', $_item);
$collection->getSelect()
    ->reset('columns')
    ->columns(array('[custom attribute code]'));
$value = $collection->getFirstItem()
    ->getData('[custom attribute code]');

您也可以使用直接SQL,但我不推荐它,除非性能是一个真正的问题:

$connection = Mage::getSingleton('core/resource')->getConnection('core_read');
$sql = <<<SQL
    SELECT `value`
    FROM catalog_product_entity_[backend type]
    WHERE entity_id = {$_item}
      AND attribute_id = [attribute ID]
SQL;
$row = $connection->fetchRow($sql);
$value = $row['value'];

答案 4 :(得分:1)

如果所需的产品价值基于下拉列表/来源属性,则可以执行以下操作:

    $resource = $magentoProductInstance->getResource();
    $value = $resource->getAttributeRawValue($productId, $attributeCode, Mage::app()->getStore());
    //if the value is an option id continue with this
    $optionId = $value;
    $value = $resource->getAttribute($attributeCode);
        return $productAttribute
            ->setStoreId(Mage::app()->getStore()->getId())
            ->getSource()
            ->getOptionText($optionId);