学说 - 如何在两个实体之间建立一对一的关系

时间:2014-12-27 19:42:44

标签: php mysql doctrine-orm

我有两个表:用户和联系人

  

用户

     
      
  • 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 = $contact?在persist()flush()正确填写user_id并将数据插入两个表之后会不会这样做?
  3. 我收到错误A new entity was found through the relationship '...\User#contact' that was not configured to cascade persist operations for entity: ...\Contact@0000000015f3aa5e000000012cd799f5. 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。
  4. 我现在已经浏览了几个小时的文档,但是我遇到了困难,我没有找到任何可以指导我的真实例子......任何人都可以通过向我展示这些实体关系的正确配置来帮助我吗?

1 个答案:

答案 0 :(得分: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;