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

Rad*_*duS 21 magento

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

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

我想知道是否有更简单的方法来获得这个自定义值而不加载整个产品?

JMT*_*ler 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;
Run Code Online (Sandbox Code Playgroud)

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


Won*_*and 32

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

所以,你可以做它具有产品标识和使用单(这将是更好的情况下,你正在做它在一个循环中,所以你不实际创建模型很多时间)

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

  • 更好的是,你可以调用`Mage :: getResourceSingleton('catalog/product')`并完全跳过模型实例化 (10认同)
  • 优点!如果你只需要处理一个产品,`$ this-> getProduct()`应该不是问题,但是如果你在产品中循环,那么这肯定会带来巨大的性能提升!有一个upvote :) (2认同)

小智 13

其他简单方法是将此"custom_attribute"添加到属性列表中,以便在检查报价项目中的产品数据时默认获取.

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

<global>
    ...
    <sales>
        <quote>
            <item>
                <product_attributes>
                    <custom_attribute />
                </product_attributes>
            </item>
        </quote>
    </sales>
    ...
</global>
Run Code Online (Sandbox Code Playgroud)


Tim*_*rch 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]');
Run Code Online (Sandbox Code Playgroud)

您也可以使用直接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'];
Run Code Online (Sandbox Code Playgroud)