我的猜测是,这是开发人员实现“通用”实体/模型的部分遗留和“便利”模式。
如您所述,相关表通常为空。原因是没有一个核心EAV实体使用此“默认”实体表结构。这些是从1.8安装开始的实体表:
mysql> select distinct(entity_table) from eav_entity_type;
+-------------------------+
| entity_table |
+-------------------------+
| customer/entity |
| customer/address_entity |
| sales/order |
| sales/order_entity |
| catalog/category |
| catalog/product |
| sales/quote |
| sales/quote_address |
| sales/quote_entity |
| sales/quote_item |
| sales/invoice |
+-------------------------+
11 rows in set (0.00 sec)
使用客户模型为例,我们可以看到,资源模型Mage_Customer_Model_Resource_Customer
延伸Mage_Eav_Model_Entity_Abstract
,源。
注:在此之前,以1.6为客户实体的资源模型,Mage_Customer_Model_Entity_Customer
这也延长Mage_Eav_Model_Entity_Abstract
,源。
如果我们检查Mage_Eav_Model_Entity_Abstract
类,我们会找到一个getEntityTable
方法。此方法用于确定在普通CRUD操作期间构建查询时要使用哪个表。另一个有趣的方法是 getValueTablePrefix
。它确定用于数据“类型”的表,这些表前缀*_datetime
,*_decimal
,*_varchar
等。
浏览这些方法的源代码(此处和此处)。
public function getEntityTable()
{
if (!$this->_entityTable) {
$table = $this->getEntityType()->getEntityTable();
if (!$table) {
$table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
}
$this->_entityTable = Mage::getSingleton('core/resource')->getTableName($table);
}
return $this->_entityTable;
}
在上述方法中,我们可以看到,如果实体类型未定义自定义表,则默认为Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
。该常量的值是'eav/entity'
,然后将其转到eav_entity
表中(假设应用程序中没有配置的表前缀)。如果没有为给定实体配置任何方法,我提到的第二种方法将作为前缀退回到该表上。如果您检查eav_entity_type
表中该value_table_prefix
列的值,您会发现它们全都是NULL
。
public function getValueTablePrefix()
{
if (!$this->_valueTablePrefix) {
$prefix = (string)$this->getEntityType()->getValueTablePrefix();
if (!empty($prefix)) {
$this->_valueTablePrefix = $prefix;
/**
* entity type prefix include DB table name prefix
*/
//Mage::getSingleton('core/resource')->getTableName($prefix);
} else {
$this->_valueTablePrefix = $this->getEntityTable();
}
}
return $this->_valueTablePrefix;
}
该方法中的逻辑非常简单,如果未定义值前缀,则使用实体表名称作为前缀。
我认为,由于这些表已经在Magento中使用了很长时间了,所以最好将它们保留在其中以保持向后兼容性,而不是直接删除它们。我认为他们追求的想法是易于使用的实体/模型结构,其他开发人员只需扩展几个类即可,并具有可以通过管理员更改的“动态”属性(请参阅产品目录和客户模型)。不幸的是,上述模式的实现和实践似乎无法很好地扩展并导致问题。我从未见过在野外使用这种结构,可能是由于缺乏文档和示例用例或性能不佳。
我不是核心开发人员(或考古学家),但是我是从代码和数据结构中收集的,希望它有助于阐明一些信息。