2

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

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

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

用户.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;

显然我不能按用户映射,因为它从地址指向用户。我想我可以在地址表中添加另一个外键,但我想知道是否有更好的方法来执行此操作并继续为用户和地址使用相同的外键列。

4

1 回答 1

3

您只需要mappedBy在存在双向关系时指定一个属性来确定哪一方是拥有方。

从文档:

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

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

...

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

双向关系的反面必须通过使用 OneToOne、OneToMany 或 ManyToMany 映射声明的 mappedBy 属性来引用其拥有方。mappedBy 属性指定实体中作为关系所有者的字段。

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


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

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

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

/**
 * @OneToMany(targetEntity="Address", mappedBy="supplier", cascade={"persist", "remove"}) 
 */
private $addresses;
于 2013-09-23T14:21:51.933 回答