【问题标题】:save an attribute value without saving its parent entity in Magento保存属性值而不在 Magento 中保存其父实体
【发布时间】:2011-07-16 01:04:29
【问题描述】:

我希望能够在不保存其父实体的情况下保存属性的值。我通过模块的 sql/setup 文件 (ref) 创建了一个新的客户属性,现在我想为每个现有客户填充该属性。我已经为在实体加载(afterLoad)期间检测空值并生成内容的属性创建了一个后端模型,但我犹豫是否要在该过程中保存实体。

class Aligent_Referral_Model_Customer_Attribute_Backend_Referralcode extends Mage_Eav_Model_Entity_Attribute_Backend_Abstract
{
public function afterLoad($oCustomer)
{
    $vAttrCode = $this->getAttribute()->getAttributeCode();
    $vValue = $oCustomer->getData($vAttrCode);
    if (empty($vValue)){
        $oCustomer->setData($vAttrCode, Mage::helper('referral')->generateRafCode($oCustomer));
    }
    return $this;
}
}

理想情况下,我想在afterLoad 方法中调用类似$this->getAttribute()->setValue('blah')->save() 的东西,这样它就不会依赖用户点击保存。

我可以编写一个脚本来加载所有客户的集合并引导他们设置值,但是有超过 50,000 个客户,我担心在生产服务器上运行它会影响性能...

任何想法表示赞赏。
京东

【问题讨论】:

    标签: php magento attributes entity-attribute-value


    【解决方案1】:

    EAV 资源模型提供了在不保存实体的情况下保存单个属性的能力。

    $value = Mage::helper('referral')->generateRafCode($oCustomer);
    $oCustomer->setData($vAttrCode, $value)->getResource()->saveAttribute($oCustomer, $vAttrCode);
    

    【讨论】:

    • 不错!!我喜欢它,现在把它放在我的笔记里。
    • @dan.codes 你记笔记了吗?我认为这就是 StackOverflow 的全部意义......你会注意到我回到这个问题的原因是因为我需要再次使用它并且没有笔记! :)
    • @JonathanDay Ha,是的,它是笔记和堆栈溢出收藏夹的集合,以及过去的项目代码 sn-ps。
    • 我想补充一点,这对于具有“静态”后端类型的属性是不可能的!您将收到错误“'字段列表'中的未知列'customer_entity.value_id'”
    • @vinai 我可以使用这种方法将 eav 属性保存到特定的商店范围吗?
    【解决方案2】:

    所以一个选项可以直接写入数据库。这不是特别优雅,但在实现为现有客户(或其他实体)填充新属性的“延迟加载”方法方面非常有效。这是我在问题中发布的 Attribute_Backend_Referralcode 中的附加代码:

    $vAttrValue = 'some string';
    $oCustomer->setData($vAttrCode, $vAttrValue);
    $iAttrId = $this->getAttribute()->getAttributeId();
    $data = array(
                'entity_type_id' => $oCustomer->getEntityTypeId(),
                'attribute_id' => $iAttrId,
                'entity_id' => $oCustomer->getId(),
                'value' => $vAttrValue,
            );
    $vTableName = $this->getAttribute()->getBackend()->getTable();
    Mage::getResourceModel('table/alias')->getWriteAdapter()->insert($vTableName, $data);
    

    它需要公开一个公共方法来获取 Mysql4 模型上的 Write Adapter,但这没什么大不了的。

    仍然有兴趣知道是否有更好地使用 EAV 模型层的方法...

    【讨论】:

      【解决方案3】:

      Vinai 提供的解决方案不适用于后端类型为静态的属性。在静态的情况下,您只能执行以下操作:

              $adapter = Mage::getSingleton('core/resource')->getConnection('core_write');
              $adapter->update(
                  "customer_entity",
                  array("group_id" => $customerGroupId),
                  "entity_id=$customerId"
              );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 2011-08-21
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多