2015-06-16 47 views
1

我有两个实体。用户和联系人。用户和联系人具有相同的属性phone_number。如果它存在,我想要获得与用户对象的所有联系人。联系人表中存在相同的电话号码,但在用户表中不存在。Symfony一对一,单向关系

下面是联系人实体注释:

/** 
* @ORM\OneToOne(targetEntity="Dlabs\ServiceBundle\Entity\User", mappedBy="contact") 
* @ORM\JoinColumn(name="phone", referencedColumnName="phone_number", nullable=true) 
*/ 
private $user; 

当我更新我的架构,我得到以下错误:

[Doctrine\DBAL\DBALException] An exception occurred while executing 'ALTER TABLE contact ADD CONSTRAINT FK_83DFDFA4444F97DD FOREIGN KEY (phone) REFERENCES users (phone_number) NOT DEFERRABLE INITIALLY IMMEDIATE': SQLSTATE[23503]: Foreign key violation: 7 ERROR: insert or update on table "contact" violates foreign key constraint "fk_83dfdfa4444f97dd" DETAIL: Key (phone)=(+38640775xxx) is not present in table "users".

[PDOException] SQLSTATE[23503]: Foreign key violation: 7 ERROR: insert or update on table "contact" violates foreign key constraint "fk_83dfdfa4444f97dd" DETAIL: Key (phone)=(+38640775xxx) is not present in table "users".

有谁知道哪种方式我应该改变我的注解,这将工作?谢谢!

回答

2

您可以对您的注释做出改变,使其与您现有的关系一起工作。

您已经在Contact和User实体之间定义了一个可为空的一对一关系。从类的角度来看,这意味着Contact的$用户必须指向User的实例或为null。从相应的表格角度来看,这意味着contact.phone必须匹配user.phone_number或者为null。

虽然在PHP宽松打字意味着理论上可能联系人的$用户是用户对象或字符串电话号码,这不能用教条映射表示。

两种可能的方案是:

  1. 不要定义联系人和用户之间的明确的实体关系,但使用的查询将它们连接在一起(你可以把查询到自定义ContactRepository)。

  2. 创建第三个实体,PhoneNumber映射到一个单独的表。然后联系人将与PhoneNumber($ phone)建立一对一的关系,并且PhoneNumber与用户(例如$ owner)具有一对一的关系。然后,无论是否有关联的用户,属于联系人的电话号码都可以存在。