2011-07-16 22 views
8

親エンティティを保存しないで属性の値を保存したいと考えています。モジュールのsql/setupファイル(ref)を使用して新しい顧客属性を作成しました。これで、既存の顧客ごとにその属性を設定します。エンティティのロード(afterLoad)中にnull値を検出してコンテンツを生成する属性のバックエンドモデルを作成しましたが、プロセスのその時点でエンティティを保存することを躊躇しています。親エンティティをMagentoに保存せずに属性値を保存する

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人以上の顧客がいて、それをプロダクションサーバーで実行することによるパフォーマンスへの影響が懸念されています...

ご迷惑をおかけして申し訳ございません。
JD

答えて

2

これは、データベースに直接書き込むための1つのオプションです。これは特に優雅ではありませんが、既存の顧客(または他のエンティティ)に新しい属性を設定するための「遅延ロード(lazy-load)」アプローチを達成する上で非常に効果的です。

$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モデル上の書き込みアダプタを取得するためのパブリックメソッドをさらす必要ですが、そこに大したことない:ここで私は疑問に投稿されたものにAttribute_Backend_Referralcodeで追加のコードがあります。

それでも

より良いEAVモデル層を使用するアプローチがあるかどうかを知ることに興味...

19

EAVのリソース・モデルは、エンティティを保存せずに単一の属性を保存する機能を提供しています。

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

完全にエレガントで演奏性があります。おかげで@vinai –

+0

素敵!私は今、それを私のメモに入れておくのが大好きです。 –

+0

@ dan.codesメモを保存しますか?私はStackOverflowの全体のポイントだと思った...私はこの質問に戻ってきた理由は、私はそれを再度使用する必要があり、ノートを持っていないからです! :) –

関連する問題