学说PHP:多态关联

时间:2011-01-17 21:48:05

标签: php inheritance doctrine-orm polymorphic-associations

我正在使用Doctrine PHP ORM 2.0

我想要实现的是以下类层次结构。 (请注意,以下代码片段将无法执行,因为它在语法上都不正确PHP,也无法正确使用Doctrine注释。)

@MappedSuperclass
abstract class Location {}

@Entity
class GeoId {
  @Column(type = "float") $latitude;
  @Column(type = "float") $longitude;

  // this is the part that my question concerns
  @???
  $location; // any subclass of location can go here
}

现在,对于Location的子类,我们可以使用CityStateCountry。或Adress,如果我们想要非常具体。有关此类层次结构的更多信息:

class Adress  { $parent; /* of type City, ... some other attributes */ }
class City    { $parent; /* of type State */ }
class State   { $parent; /* of type Country */ }
class Country {}

(上述层次结构将使我的答案倾向于每个表的解决方案。)

问题:

  1. 是否可以在实体中具有多态属性,如果是,我该如何实现它?
  2. 我可以使用哪种继承策略实现Location类层次结构(如下所示),以及哪些策略是首选的(即MappedSuperclass,Single-Table或Class-Table继承)?

3 个答案:

答案 0 :(得分:4)

  

是否有可能具有多态性   实体中的属性,如果是,则如何   我实施它吗?

是的,Doctrine 2支持三种不同类型的继承:MappedSuperclass,Single Table和Class Table ......如您所知。 Doctrine Reference解释了如何实施它们。

这是一篇关于映射对象继承的好文章:Mapping Objects to Relational Databases: O/R Mapping In Detail

答案 1 :(得分:0)

在这种情况下,您需要单表或类表继​​承。因为您要查询根(位置),所以出于性能原因,最好使用单表继承。

答案 2 :(得分:0)

是的,Doctrine 2将进行多态关联。使用mappedByinversedBy的双向关联存在问题,但简单的情况下工作正常。

/** @Entity */
class GeoId {
  /** @Column(type = "float") */ 
  private $latitude;
  /** @Column(type = "float") */ 
  private $longitude;

  /** @OneToOne(targetEntity="Location") */ 
  private $location;
}