保存属性值而不在Magento中保存其父实体

时间:2011-07-16 01:04:29

标签: php magento attributes entity-attribute-value

我希望能够保存属性的值而不保存它的父实体。我已经通过我的模块的sql / setup文件(ref)创建了一个新的客户属性,现在我想为每个现有客户填充该属性。我为该属性创建了一个Backend模型,该模型在实体加载(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;
}
}

理想情况下,我想在$this->getAttribute()->setValue('blah')->save()方法中调用类似afterLoad的内容,以便它不依赖于用户点击保存。

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

任何想法都赞赏。
JD

3 个答案:

答案 0 :(得分:19)

EAV资源模型提供了保存单个属性而无需保存实体的功能。

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

答案 1 :(得分: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模型层的方法......

答案 2 :(得分:0)

提供的Vinai解决方案不适用于后端类型为static的属性。如果是静态的,你只能这样做:

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