2014-12-27 106 views
3

我有兩個表:用戶和聯繫人主義 - 如何建立一個對一個實體關係之間的兩個

用戶

  • ID
  • 用戶名

聯繫方式

  • ID
  • USER_ID
  • 電子郵件 (我已經簡化了結構)

現在,如何設置主義實體是否正確?

/** 
* @ORM\Entity 
* @ORM\Table(name="users") 
*/ 
class User extends BaseEntity { 

    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="bigint") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", unique=true) 
    */ 
    protected $username; 

    /** 
    * @ORM\OneToOne(targetEntity="Contact") 
    * @ORM\JoinColumn(name="id", referencedColumnName="user_id", onDelete="CASCADE") 
    **/ 
    protected $contact; 
} 

聯繫單位:

/** 
* @ORM\Entity 
* @ORM\Table(name="contacts") 
*/ 
class Contact extends BaseEntity { 

    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="bigint") 
    */ 
    protected $id; 

    /** 
    * @var User 
    * @ORM\OneToOne(targetEntity="User") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $user; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    protected $email; 
} 

的事情是,我不知道該實體關係是否設置正確。

  1. 我不知道如何在User被刪除,然後刪除Contact而不是其他方式設置。
  2. 如果我創建$user = new User()然後$contact = new Contact()如何加入它們? $user->contact = $contactpersist()flush()是否正確填寫user_id並將數據插入到兩個表中?
  3. 我得到錯誤A new entity was found through the relationship '...\User#contact' that was not configured to cascade persist operations for entity: ...\[email protected] To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement '...\Contact#__toString()' to get a clue.我被困在這一個,我認爲這與我的問題#1有關,因此我無法測試#2。

我一直在瀏覽文檔數小時,但我卡住了,我沒有找到任何真正的例子,可以指導我......任何人都可以通過向我展示這些實體關係的適當配置來幫助我嗎?

回答

5

爲了級聯用戶刪除所以它的接觸也被刪除,在Contact實體添加onDelete="CASCADE"JoinColumn註釋的$user屬性(如果用戶被刪除,這隻會刪除聯繫人)

/** 
* @var User 
* @ORM\OneToOne(targetEntity="User") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE") 
*/ 
private $user; 

如果您在將其添加到用戶之前持續保持聯繫,則不應該出現任何錯誤。如果你想添加直接分配新的非持久性接觸給用戶一個新的聯繫人, 那麼你就需要添加cascade={"persist", "remove"}User實體

/** 
* @ORM\OneToOne(targetEntity="Contact",cascade={"persist", "remove"}) 
* @ORM\JoinColumn(name="id", referencedColumnName="user_id") 
**/ 
protected $contact; 
+0

好的,謝謝你,這聽起來不錯。雖然,我嘗試設置'cascade = {「persist」,「remove」})'當我做'$ user = new User()''$ contact = new Contact()''$ user-> contact = $ contact ''$ entityManager-> persist($ user)''$ entityManager-> flush()'用戶被創建但沒有聯繫。我究竟做錯了什麼? – simPod 2014-12-28 13:15:21

+0

如果我手動'堅持($聯繫)'它的工作。我必須這麼做嗎?或者我可以通過'@ ORM'註釋來包含它嗎? – simPod 2014-12-28 13:21:59

+1

@simPod將'cascade = {「persist」,「remove」})'添加到'User'實體的'$ contact'屬性應該允許您將一個未保留的聯繫人添加到'User'。 'User'中是否有其他映射可能導致問題? – FuzzyTree 2014-12-28 18:06:05

相關問題