MagentoのORMを使用して特定のIDフィールドを挿入する


14

MagentoのシンプルなORM(Mage_Core_Model_AbstractおよびMage_Core_Model_Resource_Abstract)を使用して、特定の主キーを持つモデル行を挿入する方法はありますか?

たとえば、空のMagentoシステムに対して次を実行した場合

Mage::getModel('core/website')->setData(array (
    'website_id' => 2,
    'code' => 'foo',
    'name' => 'Main Website',
    'sort_order' => 0,
    'default_group_id' => 1,
    'is_default' => 1,
)); 

core_websiteテーブルに新しいエントリが追加される予定です。ただし、Magentoはここで静かに何もしません。

リソースを掘り下げると、データベースリソースクラスでこれに違反しているように見えます

#File: app/code/core/Mage/Core/Model/Resource/Db/Abstract.php
if (!is_null($object->getId()) && (!$this->_useIsObjectNew || !$object->isObjectNew())) {
    //update stuff here
}
else
{
    //insert stuff here
}

モデルにはidがあり(つまり、特定のIDを挿入しています)、_useIsObjectNewハードコーディングがfalseになっているため、保存要求は常にinsertパスにルーティングされます。

デフォルトのMagentoモデルで強制的に挿入する方法はありますか?(書き換え/クラス置換なし)。

はい、生のSQLはオプションですが、イベント機能は失われます。


自動インクリメントフィールドにIDを割り当てようとしているのはなぜですか?これがダウンストリームの依存関係である場合、レコードを作成してから自動生成されたPKを取得するだけではいけませんか?
ラルフ・タイス

@RalphTiceはい、それはおそらく日常の使用のために行う正しいことでしょう。
アランストーム

回答:


5

ええ (編集:)トリックはMage_Core_Model_Abstract、リソースモデルが予期するidフィールドを持たないサブクラスを使用することです。

$evil = Mage::getModel('core/store'); // that's a store object, baby!
$evil->setData(
    array (
        'website_id' => 99,
        'code' => 'foo',
        'name' => 'Main Website9',
        'sort_order' => 0,
        'default_group_id' => 1,
        'is_default' => 1,
    )
);

Mage::getResourceModel('core/website')->forsedSave($evil);

Mage::dispatchEvent('website_save_commit_after', [...])コアで消費されるのを見るだけのイベントです。それは次のように簡単にすることができます

Mage::getModel('core/website')->setData($evil->getData())->afterCommitCallback();

いずれにせよ、シャワーが必要です。


1
クリーンになったら—それに従うかどうかforsedSave わかりません— gist.github.com/astorm/5219357に同様のidチェックがあります。これはあなたのために働きましたか、それとも単なる理論でしたか?
アランストーム

私の答えを編集して、よりわかりやすくしました。
ベンマーク

...そしてそれは私のために働いた。
ベンマーク

ああ、それはコピーして貼り付けるのではなく、自分のコードを入力することで得られるものです。これを出発点として使用するVarien_Objectと、異なるモデルクラスの代わりにを使用せず、リソースの非償却saveメソッドを呼び出す理由を確認できます か?
アランストーム

上記の私の質問に答えると、それは汎用リソースのsaveメソッドがMage_Core_Model_Abstractデータ配列のタイプヒントを持っているからです。
アランストーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.