EAV(实体属性值)

实体

存储有关所存储数据类型的信息。就 Magento 而言,这是客户,产品,类别等。

属性

每个实体的各个属性,例如姓名,体重,电子邮件地址等。

给定实体和属性的值。例如,我们可以指定客户实体和电子邮件属性,然后为其指定值 hello@example.com

数据库架构

eav_entity

实体表。

eav_entity_attribute

属性表。

eav_entity_ {类型}

值表。类型是 datetime,decimals,int,text 和 varchar。

需要注意的是,eav_entity_varchar 表的值类型为 varchar,即使日期或整数更适合该值。

模型与资源模型

Mage / Eav / Model / Resource 中的所有模型都是 Mysql4,是资源模型。

另外还有 Entity / Abstract.php 和 Entity / Setup.php。

平与对比 EAV

EAV 模型更复杂,提供了从多个表中保存和加载的逻辑,而平面或标准模型相对简单(传统)。

标准模型主要通过数据设置器和使用单个表的 getter 管理其属性。EAV 模型主要管理其属性模型。标准模型仅将其数据保存到表中并从中加载。EAV 模型在加载基础数据后加载所有(或特定集)属性,并在保存数据(包括插入,更新和删除属性)后保存属性。

EAV 资源模型示例

要使用 EAV 存储模式查找实体来搜索字符串,可以使用 Mage_Eav_Model_Entity_Abstract。这应该揭示基于 EAV 结构的所有资源模型。但是,生成的列表将包含许多不再使用的 Mage_Sales 模块的过时类。

包含使用 EAV 存储架构的实体的唯一模块是 Mage_Catalog(类别和产品)和 Mage_Customer(客户和地址)。

客户组使用平面表存储架构。所有销售实体都通过发布 Magento 1.4 转换为平面表实体。

使用 EAV 的原因是实体可以具有不确定数量的属性,因此保持灵活性。例如,当你向 Customer 实体(它是 EAV 实体)添加新属性时,不需要更改数据库表以添加此新属性。

好处

灵活性数据库模式不需要随模型 Quick 更改而实现

缺点

  • 低效

通常返回 20 列的查询将包含 EAV 中的 20 个自联接。但是,Mage_Eav 模块通常不使用连接来加载属性值数据。而是使用联合选择。联接仅用于过滤 EAV 集合。

  • 没有子类型之间关系的机制
  • 没有实体子类型的分组

网站和商店范围

要在 EAV 中处理网站和存储范围属性值,目录实体上存在 store_id 值,以显示链接回 core_store 的范围。与普通商店(商店视图)一起,还有一个商店'0’,这是全局价值。当在特定商店上时,系统将首先检查当前商店上的实体值,然后回退到全局实体。Mage_Customer EAV 实体没有 store_id 范围列。

插入,更新和删除

要确定是否需要对属性执行插入,更新或删除,请对原始对象进行比较。当从数据库中检索实体时,原始对象基本上是数据对象的副本。

  • 如果该属性最初存在且其新值不为空; 它更新。
  • 如果该属性最初存在但其新值设置为空; 它删除了。 - 如果该属性最初不存在且其新值不为空; 它插入。

属性管理

属性模型

属性模型表示数据库表单中的属性,其逻辑是所有属性的标准,很难更改

前端模型

属性与前端的接口,并提供属性在前端需要的任何逻辑,例如图像上的 getUrl() 方法。

后端模型

这些属性在保存到数据库之前对属性执行验证。例如,密码后端模型在保存之前将密码转换为哈希。它还会在保存之前检查密码和密码确认是否匹配。

来源模型

用于填充属性的可用选项,例如,目录/ product_status 已启用和禁用。

所需方法

源模型需要:

<?php
    public function getAllOptions();
    public function getOptionText($value);
?>

通常只需要实现 getAllOptions(),因为 getOptionText() 的实现已经存在于抽象源模型 Mage_Eav_Model_Entity_Attribute_Source_Abstract 中。

前端模型不需要方法 getValue()

后端模型需要:

<?php
    public function getTable();
    public function isStatic();
    public function getType();
    public function getEntityIdField();
    public function setValueId($valueId);
    public function getValueId();
    public function afterLoad($object);
    public function beforeSave($object);
    public function afterSave($object);
    public function beforeDelete($object);
    public function afterDelete($object);
    public function getEntityValueId($entity);
    public function setEntityValidId($entity, $valueId);
?>

所有这些方法都在抽象后端模型 Mage_Eav_Model_Entity_Attribute_Backend_Abstract 中实现。对于自定义后端模型,只需要覆盖需要自定义的方法。

系统配置源模型

不能用于 EAV 属性。EAV 源模型实现 getAllOptions 方法,而 adminhtml 源模型实现 toOptionArray() 方法。

默认系统配置源模型可以在 Mage / Adminhtml / Model / System / Config / Source /中找到。

属性源模型

Attribute Source Models 的目的是提供 select 和 multiselect 属性的选项和值列表。如果需要,它们还会将列信息提供给目录平台索引器。

要获取属性的所有选项列表,请执行以下操作:

<?php
    $options = $attribute->getSource()->getAllOptions(false);

    // or for admin
    $options = $_attribute->getSource()->getAllOptions(true, true);
?>

默认属性模型

如果没有将类指定为前端,后端或 - 对于选择或多选属性 - 源模型,则使用默认类。

默认属性前端模型是 Mage_Eav_Model_Entity_Attribute_Frontend_Default。

默认属性后端模型取决于属性代码,并在方法 Mage_Eav_Model_Entity_Attribute :: _ getDefaultBackendModel() 中确定。

<?php
    protected function _getDefaultBackendModel()
    {
        switch ($this->getAttributeCode()) {
            case 'created_at':
                return 'eav/entity_attribute_backend_time_created';

            case 'updated_at':
                return 'eav/entity_attribute_backend_time_updated';

            case 'store_id':
                return 'eav/entity_attribute_backend_store';

            case 'increment_id':
                return 'eav/entity_attribute_backend_increment';
        }

        return parent::_getDefaultBackendModel();
    }
?>

如果方法落到最后一行,则使用 Mage_Eav_Model_Entity_Attribute_Backend_Default。

默认源模型在 Mage_Eav_Model_Entity_Attribute_Source_Table 中设置。这在目录模块属性模型中设置。永远不会使用 eav 模块中指定的默认配置源模型。

添加属性

要添加 EAV 属性,请通过在安装程序类中扩展来使用 Mage_Eav_Model_Entity_Setup。

addAttribute() 创建属性,将其添加到组和集(包括默认值),或者如果已存在则进行更新 updateAttribute() 仅更新属性数据。自定义安装类可用于扩展这些方法,添加其他数据或简化所需的参数。

平台

平面目录属性由索引器管理:

Mage_Catalog_Model_Resource_Product_Flat_Indexer :: updateAttribute()Mage_Catalog_Model_Resource_Category_Flat :: synchronize() 如果产品属性被添加到平面表中(参见 Mage_Catalog_Model_Resource_Product_Flat_Indexer :: getAttributeCodes()):

静态(后端类型)可过滤用于产品列表用于促销规则用于按系统属性排序每个商店都有一个不同的平面表,每个商店都包含一个不同的商店范围的实体属性值。通过为每种语言设置不同的商店来管理多语言值。