如何使用Doctrine2中的级联选项来自动持久化关联实体


How to use the cascade option in Doctrine2 to have associated entities automatically persisted?

谁能给我解释一下:

$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();

为什么我要调用实体评论,而试图插入到数据库?

我有级联。

  1. 这是否意味着如果我在用户实体中有50个关系与其他实体,我必须手动调用每个关系时,试图更新/插入/删除?
  2. 如果我必须手动执行所有操作,为什么存在级联?

如果我必须手动调用所有的关系,那么使用Doctrine就有点愚蠢了。

我不明白。如有任何帮助,不胜感激。

这是连接到这个:学说2,无法插入到数据库时,关系存在

要让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。