Symfony一对一单向关系

Symfony一对一单向关系,symfony,doctrine-orm,Symfony,Doctrine Orm,我有两个实体。用户和联系人。用户和联系人具有相同的属性电话号码。如果用户对象存在,我想获取其所有联系人。也可能联系人表中存在相同的电话号码,但用户表中不存在 以下是联系人实体中的注释: /** * @ORM\OneToOne(targetEntity="Dlabs\ServiceBundle\Entity\User", mappedBy="contact") * @ORM\JoinColumn(name="phone", referencedColumnName="phone_number"

我有两个实体。用户和联系人。用户和联系人具有相同的属性电话号码。如果用户对象存在,我想获取其所有联系人。也可能联系人表中存在相同的电话号码,但用户表中不存在

以下是联系人实体中的注释:

/**
 * @ORM\OneToOne(targetEntity="Dlabs\ServiceBundle\Entity\User", mappedBy="contact")
 * @ORM\JoinColumn(name="phone", referencedColumnName="phone_number", nullable=true)
 */
private $user;
当我更新架构时,会出现以下错误:

[Doctrine\DBAL\DBALException]执行时发生异常 '更改表联系人添加约束FK_83DFA4444F97DD外键 (电话)参考用户(电话号码)最初不可延迟 立即”:SQLSTATE[23503]:外键冲突:7错误:insert 或表“contact”上的更新违反外键约束 “fk_83DFA4444F97DD”详细信息:键(电话)=(+38640775xxx)未被激活 在“用户”表中显示

[PDOException]SQLSTATE[23503]:外键冲突:7错误: 表“contact”上的插入或更新违反外键约束 “fk_83DFA4444F97DD”详细信息:键(电话)=(+38640775xxx)未被激活 在“用户”表中显示


有人知道我应该以何种方式更改注释以使其生效吗?谢谢

您无法对注释进行任何更改,以使其与现有关系一起工作

您已在联系人和用户实体之间定义了可为空的一对一关系。从类的角度来看,这意味着联系人的$user必须指向user的实例或为null。从相应的表透视图来看,这意味着contact.phone必须与user.phone_号码匹配或为空

虽然在PHP中,松散类型表示联系人的$user在理论上可能是用户对象或字符串电话号码,但这不能用原则映射表示

两种可能的替代方案是:

  • 不要在Contact和User之间定义明确的实体关系,而是使用查询将它们链接在一起(您可以将查询放入自定义ContactRepository)

  • 创建第三个实体PhoneNumber,它映射到一个单独的表。然后联系人将与电话号码($phone)建立一对一的关系,电话号码将与用户(例如$owner)建立一对一的关系。那么,属于某个联系人的电话号码就可以存在,而不管它是否有关联的用户