2015-06-16 50 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)具有一對一的關係。然後,無論是否有關聯的用戶,屬於聯繫人的電話號碼都可以存在。