Php EAV表上的ORM规则

Php EAV表上的ORM规则,php,orm,doctrine,entity-attribute-value,Php,Orm,Doctrine,Entity Attribute Value,我曾计划创建我的应用程序,并为模型使用ORM,但问题是,数据库中有一部分使用实体属性值表 我非常喜欢条令ORM,但我不知道是否有可能创建类似于任何普通条令实体的类,而实际连接到的表是EAV风格的 是否有可能在这方面使用原则,如果有,如何使用?绝对有可能: 有这样的关系: Object(一对多)->AttributeValue->multi-to-one->AttributeType鉴于如何使用条令在实体和属性之间建立关系似乎是显而易见的。在最复杂的情况下,我们处理的是一种关系 假设我们想把一个属

我曾计划创建我的应用程序,并为模型使用ORM,但问题是,数据库中有一部分使用实体属性值表

我非常喜欢条令ORM,但我不知道是否有可能创建类似于任何普通条令实体的类,而实际连接到的表是EAV风格的

是否有可能在这方面使用原则,如果有,如何使用?

绝对有可能:

有这样的关系: Object(一对多)->AttributeValue->multi-to-one->AttributeType

鉴于如何使用条令在
实体
属性
之间建立关系似乎是显而易见的。在最复杂的情况下,我们处理的是一种关系

假设我们想把一个属性
Name
映射到一个实体
User
。假设一个用户只有一个名称,并且每个名称都只属于一个用户,则可以使用关系来存档此链接

但是如何建模
属性
之间的关系呢?问题在于,值可以是不同类型的,甚至需要不同数量的字段才能保存其信息

考虑属性
name
phone\u number
。虽然名称可能由字符串表示,但电话号码可能需要整数。或者,甚至有必要在一个单独的文件中不仅记录号码,还记录区号

因为EAV需要非常灵活的值表示,所以不可能将它们全部存储在数据库表的同一字段中(忽略blob、数据序列化等)。因此,大多数EAV实现都使用表示不同值类型的不同表

为了达到这种灵活性,信条的特点。它基本上允许您扩展条令实体。为此,为实体的每个子类型指定一个
鉴别器

/**
  * @Entity
  * @InheritanceType("JOINED")
  * @DiscriminatorColumn(name="value_type", type="string")
  * @DiscriminatorMap({"name" = "Name", "phone" = "PhoneNumber"})
*/
class Value
{
// ...
}

/** @Entity */
class Name extends Value
{
// ...
}

/** @Entity */
class PhoneNumber extends Value
{
// ...
}
Value
类为所有值提供通用实现,即id。每个子类(即
Name
PhoneNumber
)通过其特定值扩展这些通用值,例如附加字段

  • @DiscriminatorColumn
    定义父关系中存储值类型的列
  • 条令使用
    @DiscriminatorMap
    将类型从
    @DiscriminatorColumn
    映射到其中一个类

可以将
属性
之间的关系指定给父类。然后,从属性调用值将获取所有类型的值,这些值可以在运行时使用例如进行过滤(和处理)。

开箱即用,我对此表示怀疑。您可能会推出自己的实现。条令是非常可扩展的,因为根据值的表关系(根据其数据类型连接正确的属性值表)是不可能的(如我所知),使用条令应该非常棘手。如果要获取在另一个表中具有关系的某个属性呢?是,这就是问题所在-几乎可以肯定的是,唯一的解决方案是您必须在代码中使用接口来获取EAV属性的属性,不幸的是,这增加了一层复杂性。如果您需要1000个不同的属性,您必须编写1000个类?您的应用程序的用户不能添加新属性?例如,您可以创建一个
StingValue
,以便用户可以添加类型为
string
的新值。。。诚然,PhoneNumber示例不是一个很好的示例。但这个概念是EAV,而不是学说。