我计划创建我的应用程序并为模型使用ORM,但问题是,数据库中有一部分使用实体属性值表。
我很喜欢Doctrine ORM,但我不知道是否可能创建类,使其看起来像任何普通的doctrine实体,即使表实际上是EAV风格的。
是否可能在这种情况下使用Doctrine,如果可以,如何操作?
我计划创建我的应用程序并为模型使用ORM,但问题是,数据库中有一部分使用实体属性值表。
我很喜欢Doctrine ORM,但我不知道是否可能创建类,使其看起来像任何普通的doctrine实体,即使表实际上是EAV风格的。
是否可能在这种情况下使用Doctrine,如果可以,如何操作?
绝对可以实现:
建立如下关系: 对象(一对多)-> 属性值 -> 多对一 -> 属性类型
鉴于EAV,显然使用Doctrine可以很容易地建立entity
和attribute
之间的关系。在最复杂的情况下,我们处理一个Many to Many关系。
因此,假设我们想将属性Name
映射到实体User
。假设用户有且仅有一个名称,并且每个名称都属于一个用户,可以使用One to One关系来实现此链接。
但是如何建模attribute
和value
之间的关系?问题在于值可能具有不同的类型,甚至需要不同数量的字段才能保存其信息。
/**
* @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
{
// ...
}
StringValue
的类,以便用户可以添加新类型为string
的值...诚然,PhoneNumber示例并不是很好。但是这个概念是EAV而不是Doctrine。 - magic_al