Php 学说中的多重多人关系

Php 学说中的多重多人关系,php,doctrine-orm,foreign-keys,entity-relationship,Php,Doctrine Orm,Foreign Keys,Entity Relationship,一个简单的问题,但我找不到任何文档 我想将一个表连接到另两个表,在同一列上,具有相同类型的关系。非常简单: 我有一个地址表和一个用户表。非常简单,一个用户可以有多个地址: User.php /** * @OneToMany(targetEntity="Address", mappedBy="user", cascade={"persist", "remove"}) */ private $addresses; /** * @ManyToOne(targetEntity="User",

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

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

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

User.php

/**
 * @OneToMany(targetEntity="Address", mappedBy="user", cascade={"persist", "remove"}) 
 */
private $addresses;
/**
 * @ManyToOne(targetEntity="User", inversedBy="addresses") 
 */
private $user;
/**
 * @OneToMany(targetEntity="Address", mappedBy="**???**", cascade={"persist", "remove"}) 
 */
private $addresses;
Address.php

/**
 * @OneToMany(targetEntity="Address", mappedBy="user", cascade={"persist", "remove"}) 
 */
private $addresses;
/**
 * @ManyToOne(targetEntity="User", inversedBy="addresses") 
 */
private $user;
/**
 * @OneToMany(targetEntity="Address", mappedBy="**???**", cascade={"persist", "remove"}) 
 */
private $addresses;
现在我想添加一个新表,它也将使用地址(一个供应商可能也有许多地址)

Supplier.php

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

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

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

从文档中:

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

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

双向关系的反向侧必须引用其 通过使用OneTONE的mappedBy属性拥有一方, 一对多或多对多映射声明。mappedBy属性 指定实体中的字段,该字段是 关系

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


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

/**
 * @ManyToOne(targetEntity="Supplier", inversedBy="addresses") 
 */
private $supplier;
然后,您可以在
supplier.php

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

我想你的回答的后半部分会有用的,我刚刚完成了一半。我试图避免这个额外的列,但我想这会在那里留下重复的外键,所以看起来它是必需的。