主义 - 如何建立一个对一个实体关系之间的两个

问题描述:

我有两个表:用户和联系人主义 - 如何建立一个对一个实体关系之间的两个

用户

  • 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。

我一直在浏览文档数小时,但我卡住了,我没有找到任何真正的例子,可以指导我......任何人都可以通过向我展示这些实体关系的适当配置来帮助我吗?

为了级联用户删除所以它的接触也被删除,在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