9

メールアドレスのリストをカスタムテーブルに保存する必要があるカスタム Magento モジュールを開発しています。関連するコードは次のようになります。

foreach($this->getNewSubscriptionsForAPI() as $email){
            $requestModel->setEmail($email);
            $requestModel->setAction('subscribe');
            $requestModel->setPosted(date('Y-m-d H:i:s'));
            $requestModel->save();
        }

getNewSubscriptionsForAPI()メソッドは有効なデータを返し、これは$requestModel有効な Magento モデルです。

ただし、このループが実行されると、データベース アダプタは単純に各レコードを前のレコードの上に上書きします。つまり、phpMyAdmin で「参照」を繰り返し押すと、異なるメール アドレスがデータベースに書き込まれていることがわかりますが、常に同じ行にあり、前のエントリが上書きされます。id フィールドは正しく設定されています。主キーとして、AUTO_INCREMENT に設定され、リソース モデルで id フィールドとしてフラグが立てられています。

興味深いのは、上記のループを使用して、コアnewsletter/subscriberテーブルに連続するレコードを問題なく書き込むことができることです。

もちろん、単純unset()にモデルをループの各サイクルで元に戻すこともできMage::getModel()ますが、これは (a) 非常に無駄に思え、(b) テスト用の依存性注入の設定を台無しにします (ここでは望ましくありません)。コードは独自のモデルをインスタンス化しますが、私が渡したものを使用します)。

誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

16

Magento が新しいオブジェクトを保存すると、オブジェクトの ID が自動的に生成されます。オブジェクトを保存すると、ID が生成されます。Magento にデータを新しいモデルとして再度認識させるには、モデルの設定を解除するだけですidunsetDataただし、以前のオブジェクト用に作成された可能性のあるデータも消去されるため、よりエレガントだと思います:-)。

于 2012-05-29T15:29:35.467 に答える
8

ああ、私は自分の質問に答えたようです。ループ$requestModel->unsetData();への呼び出しの直後にへの呼び出しを含めることで、意図したとおりに機能します。$requestModel->save()

unsetDataMage_Core_Model_Abstract が継承する Varien_Object によって使用可能になるメソッドです。

誰かがよりエレガントなソリューションに貢献してくれることを嬉しく思います。それを聞いてうれしいです。

于 2012-05-29T11:05:22.710 に答える