Doctrine中的多个ManyToOne关系

时间:2013-09-23 14:08:35

标签: php doctrine-orm foreign-keys entity-relationship

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

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

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

user.php的

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

Address.php

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

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

Supplier.php

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

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

1 个答案:

答案 0 :(得分:2)

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

来自文档:

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

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

...

     

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

     

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

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


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

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

然后允许您在mappedBy="supplier"

中设置Supplier.php
/**
 * @OneToMany(targetEntity="Address", mappedBy="supplier", cascade={"persist", "remove"}) 
 */
private $addresses;