跳过Magento中EAV表更新的步行属性

时间:2014-01-07 16:53:39

标签: magento-1.4

我已在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);
  }

  ...

}

为什么这会触发属性行走?我该如何防止这种情况?

1 个答案:

答案 0 :(得分:0)

刚想通了。我可以从资源连接中获取基础[PDO]连接对象,如下所示:

Mage::getSingleton('core/resource')->getConnection('core_write')
  ->getConnection()
  ->exec('my bound query goes here');

所以这里Varien_Db_Adapter_Pdo_Mysql实例公开了我要使用的PDO对象,将其从Magento的控件中取出。