我已在customer_entity
表中添加了一个名为source
的新列,我想通过管理表单维护该列。这意味着我将使用客户模型来更新该值;但是,我已经了解到它与EAV模型不同。所以我无法调用$model->setData('source')->save()
,因为该值未存储在属性表中。
您可能会问,“为什么不将其存储为属性?”有几个原因。最重要的是,我通过资源适配器为报表加入表数据。我正在寻找一个“通用选择”查询,该查询从_entity
表和那些服务于更简单模型的表中读取。
所以这是我的问题:
在Magento中更改EAV模型时,抽象方法Mage_Eav_Model_Entity_Abstract::walkAttributes
会通过_afterSave
方法触发。据我了解,这将调用任何已注册的后端模型来处理CRUD操作。
我不希望这种情况发生。就我而言,我正在使用Mage_Customer_Model_Entity_Customer
资源模型。我正在调用其写入适配器来手动执行UPDATE
查询以保持source
值。但似乎是在触发调用以保存附加到该客户的地址。这似乎是由于客户属性上注册的后端模型而触发的:
Mycompany_Customer_Model_Entity_Customer {
...
public function setSource($customerId,$source=null) {
$data=array(
'entity_id' => $customerId,
'source' => $source
);
Mage::getSingleton('core/resource')->getConnection('core_write')
->query("UPDATE `{$this->getEntityTable()}` SET `source`=? WHERE `entity_id`=?",$data);
}
...
}
为什么这会触发属性行走?我该如何防止这种情况?
答案 0 :(得分:0)
刚想通了。我可以从资源连接中获取基础[PDO]连接对象,如下所示:
Mage::getSingleton('core/resource')->getConnection('core_write')
->getConnection()
->exec('my bound query goes here');
所以这里Varien_Db_Adapter_Pdo_Mysql
实例公开了我要使用的PDO对象,将其从Magento的控件中取出。