在Magento 1.9.2中,load()如何在EAV模型中工作?

时间:2016-02-10 12:49:17

标签: magento magento-1.9

  

$ product = Mage :: getModel(' catalog / product') - > load($ this-> getProductId());

load()将在load()函数内部进入Mage_Core_Model_Abstract,

public function load($id, $field=null)
{
    $this->_beforeLoad($id, $field);
    $this->_getResource()->load($this, $id, $field);
    $this->_afterLoad();
    $this->setOrigData();
    $this->_hasDataChanges = false;
    return $this;
}

现在这应该去抽象类Mage_Catalog_Model_Resource_Abstract扩展Mage_Eav_Model_Entity_Abstract,其中定义了加载过程:

public function load($object, $entityId, $attributes = array())
    {
        Varien_Profiler::start('__EAV_LOAD_MODEL__');
        /**
         * Load object base row data
         */
        $select  = $this->_getLoadRowSelect($object, $entityId);
        $row     = $this->_getReadAdapter()->fetchRow($select);

        ...

        if (empty($attributes)) {
            $this->loadAllAttributes($object);
        } else {
            foreach ($attributes as $attrCode) {
                $this->getAttribute($attrCode);
            }
        }

        $this->_loadModelAttributes($object);

        ...
    } 

但我无法理解

$this->_getResource()->load($this, $id, $field); in Mage_Core_Model_Abstract

连接到抽象类Mage_Catalog_Model_Resource_Abstract ???

因为load($this, $id, $field)将转到abstract class Mage_Core_Model_Resource_Db_Abstract extends Mage_Core_Model_Resource_Abstract

public function load(Mage_Core_Model_Abstract $object, $value, $field = null)
{
    if (is_null($field)) {
        $field = $this->getIdFieldName();
    }

    $read = $this->_getReadAdapter();
    if ($read && !is_null($value)) {
        $select = $this->_getLoadSelect($field, $value, $object);
        $data = $read->fetchRow($select);

        if ($data) {
            $object->setData($data);
        }
    }

    $this->unserializeFields($object);

请帮帮我。

1 个答案:

答案 0 :(得分:2)

产品型号(目录/产品)中有_construct方法。创建对象时会触发此方法。它显示了要使用的资源模型:

$this->_init('catalog/product');

接下来,在load方法的Mage_Core_Model_Abstract中,有一个表达式$ this-> _getResource()。它可以带回类的对象 Mage_Catalog_Model_Resource_Product(继而来自Mage_Catalog_Model_Resource_Abstract)。

基本上,每个模型都可以拥有自己的资源模型和自己的类。