【问题标题】:Magento: Get a custom attribute value without loading the entire productMagento:在不加载整个产品的情况下获取自定义属性值
【发布时间】:2013-10-15 11:11:56
【问题描述】:

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

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

我想知道是否有更简单的方法来获取此自定义值而无需加载整个产品?

【问题讨论】:

  • 您可以将属性配置为在您需要的地方可见,您想在什么样的页面中访问它?
  • app/code/core/Mage/Catalog/Block/Product/View/Options/Type/Select.php
  • 关于
  • 开始的第131行

标签: magento


【解决方案1】:

这取决于您运行的 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 往往如此)来检索您要求的一个属性(或您要求的多个属性,因为您也可以传递一个数组)。

【讨论】:

  • $_resource->getAttributeRawValue(...) 将返回一个空白字符串,而 $this->getProduct()->getCustomAttributeValue() 将返回 null
【解决方案2】:

我只是想改进@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;

【讨论】:

  • 好点!如果您只需要处理一种产品,$this->getProduct() 应该不是问题,但如果您循环使用产品,那么这肯定会带来巨大的性能提升!投赞成票:)
  • 更好的是,您可以调用Mage::getResourceSingleton('catalog/product') 并完全跳过模型实例化
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    $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'];
    

    【讨论】:

      【解决方案5】:

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

          $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);
          
      

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签