谁能给我解释一下:
$user = new User();
/* why do I have to call Entity Comment while trying to insert into db? */
$myFirstComment = new Comment();
$user->addComment($myFirstComment);
$em->persist($user);
$em->persist($myFirstComment);
$em->flush();
为什么我要调用实体评论,而试图插入到数据库?
我有级联。
- 这是否意味着如果我在用户实体中有50个关系与其他实体,我必须手动调用每个关系时,试图更新/插入/删除?
- 如果我必须手动执行所有操作,为什么存在级联?
如果我必须手动调用所有的关系,那么使用Doctrine就有点愚蠢了。
我不明白。如有任何帮助,不胜感激。
要让Doctrine自动处理您的User#comments
属性的持久性,您必须将cascade设置为"persist"操作。
级联(持久化、删除、合并、全部)选项使您能够提交…
$em->persist($myFirstComment);
…如果你在一个双向关系的逆侧正确地设置它。它也可以自动删除User#comments
,如果你删除一个用户实体与级联"remove" !
的例子:
/**
* Bidirectional - One-To-Many (INVERSE SIDE)
*
* @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"})
*/
private $comments;
在文档的传递持久性/级联选项一章中阅读更多关于关联映射和级联的信息。
请记住:
Doctrine只检查关联的所有者方是否有更改。
仅对关联的反向所做的更改将被忽略。确保更新双向关联的双方(或者至少从Doctrine的角度来看,更新拥有方)
- onetmany协会永远不是所有者方。
- 背面必须使用OneToOne, OneToMany或manyomany映射声明的
mappedBy
属性。mappedBy
属性包含所属端关联字段的名称 - 拥有方必须使用OneToOne、ManyToOne或ManyToMany映射声明的
inversedBy
属性。inversedBy
属性的反面包含关联字段的名称。 - ManyToOne始终是双向关联的拥有方。
- OneToMany总是双向关联的反面。
此外:
你只需要调用persist如果你创建了一个新的根实体(即$user = new User()
),它还没有被原则管理(如果你已经正确设置了级联选项,你不必在你的例子中调用$myFirstComment
上的persist)。
否则,只有当实体由于某种原因没有被分离时,你才需要调用flush。