22

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

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

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

4

5 回答 5

40

这取决于您运行的 Magento 版本。不同的版本有不同的产品。如果您运行的是社区版 1.6+,目录模块有一个非常适合您的方法!

尝试以下操作:

$_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 往往是这样)来检索您要求的一个属性(或您要求的多个属性,因为您也可以传递一个数组)。

于 2013-10-16T16:39:51.340 回答
32

我只是想改进@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;
于 2014-04-15T14:18:26.683 回答
13

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

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

<global>
    ...
    <sales>
        <quote>
            <item>
                <product_attributes>
                    <custom_attribute />
                </product_attributes>
            </item>
        </quote>
    </sales>
    ...
</global>
于 2015-03-13T04:39:15.197 回答
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'];
于 2013-10-16T16:09:57.273 回答
1

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

    $resource = $magentoProductInstance->getResource();
    $value = $resource->getAttributeRawValue($productId, $attributeCode, Mage::app()->getStore());

    //if the value is an option id continue with this
    $optionId = $value;
    return $resource->getAttribute($attributeCode)
        ->setStoreId(Mage::app()->getStore()->getId())
        ->getSource()
        ->getOptionText($optionId);
    
于 2020-04-29T09:18:59.553 回答