教义中的多个多对一关系


Multiple ManyToOne relationships in Doctrine

一个简单的问题,但我找不到任何文档。

我想将一个表连接到另外两个表,在同一列上具有相同类型的关系。很简单:

我有一个地址表和一个用户表。很简单,一个用户可以有多个地址:

用户.php

/**
 * @OneToMany(targetEntity="Address", mappedBy="user", cascade={"persist", "remove"}) 
 */
private $addresses;

地址.php

/**
 * @ManyToOne(targetEntity="User", inversedBy="addresses") 
 */
private $user;

现在我想添加一个新表,它也将使用地址(一个供应商可能也有很多地址(。

供应商.php

/**
 * @OneToMany(targetEntity="Address", mappedBy="**???**", cascade={"persist", "remove"}) 
 */
private $addresses;

显然,我无法按用户映射,因为这指向从地址到用户。我想我可以在地址表中添加另一个外键,但我想知道是否有更好的方法来做到这一点并继续对用户和地址使用相同的外键列。

仅当

存在双向关系时,才需要指定mappedBy属性来确定哪一侧是拥有方。

从文档中:

http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#owning-side-and-inverse-side

  • 双向关系既有拥有方,也有反向方。
  • 单向关系只有拥有的一面。
  • 关系的
  • 拥有方确定数据库中关系的更新。

以下规则适用于双向关联:

双向关系的反侧必须指其 通过使用一对一的映射按属性拥有并肩, 一对多或多对多映射声明。映射者属性 指定实体中作为所有者的字段 关系。

在您的情况下,您只有单向关系,这意味着您不必指定mappedBy,您可以将其排除在外。


或者,您可以将供应商添加到地址类:

/**
 * @ManyToOne(targetEntity="Supplier", inversedBy="addresses") 
 */
private $supplier;

然后允许您在Supplier.php中设置mappedBy="supplier"

/**
 * @OneToMany(targetEntity="Address", mappedBy="supplier", cascade={"persist", "remove"}) 
 */
private $addresses;