我有两个表:用户和联系人
用户
- 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;
}
问题是我不确定实体关系是否设置正确。
User
然后删除Contact
而不是其他方式。$user = new User()
然后$contact = new Contact()
如何加入它们? $user->contact = $contact
?在persist()
和flush()
正确填写user_id
并将数据插入两个表之后会不会这样做?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。我现在已经浏览了几个小时的文档,但是我遇到了困难,我没有找到任何可以指导我的真实例子......任何人都可以通过向我展示这些实体关系的正确配置来帮助我吗?
答案 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;