使用Magento的ORM插入特定的ID字段


14

有没有一种方法可以使用Magento的简单ORM(Mage_Core_Model_AbstractMage_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吗?
2013年

@RalphTice是的,这可能是日常使用的正确选择。
艾伦·斯托姆

Answers:


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检查。这对您有用吗,还是只是一个理论?
艾伦·风暴

编辑了我的答案,使其更加明显。
benmarks

...确实为我工作。
Benmarks 2013年

啊哈,这就是我输入自己的代码而不是复制和粘贴所得到的。以此为起点,您是否可以看到不使用a Varien_Object而不是其他模型类,然后调用资源的未折旧save方法的任何理由 ?
艾伦·斯托姆

并在上面回答了我自己的问题,这是因为通用资源的save方法具有Mage_Core_Model_Abstract数据数组的类型提示。
艾伦·风暴
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.