如何使用Doctrine2中的级联选项自动保持关联实体?

9 php orm zend-framework symfony doctrine-orm

有人可以解释一下这个:

$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();
Run Code Online (Sandbox Code Playgroud)

为什么我在尝试插入数据库时​​必须调用实体注释?

我有级联.

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

如果我必须手动调用所有关系,那么使用Doctrine是一种愚蠢的做法.

我不懂.任何帮助表示赞赏.

这与此相关:doctrine 2,当存在关系时无法插入到数据库

Nic*_*ich 19

要让Doctrine自动处理User#comments属性的持久性,您必须将cascade设置为"persist"操作.

级联(持久,删除,合并,全部)选项使您能够省略...

$em->persist($myFirstComment);
Run Code Online (Sandbox Code Playgroud)

...例如,如果你在双向关系的反面正确设置它.User#comments如果您使用级联"删除"删除用户实体,它也可以自动删除!

例:

/**
 * Bidirectional - One-To-Many (INVERSE SIDE)
 *
 * @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"})
 */
private $comments;
Run Code Online (Sandbox Code Playgroud)

阅读文档的Transistive Persistence/Cascade Options一章中有关关联映射和级联的更多信息.

请记住:

Doctrine只会检查协会的拥有方是否有变更.

仅忽略关联的反面更改.确保更新双向关联的两面(或者至少从拥有者的角度来看,从Doctrine的角度来看)

  • OneToMany协会永远不是拥有者.
  • 反面必须使用mappedByOneToOne,OneToMany或ManyToMany映射声明的属性.该mappedBy属性包含拥有方的关联字段的名称
  • 拥有方必须使用inversedByOneToOne,ManyToOne或ManyToMany映射声明的属性.该inversedBy属性包含反面的关联字段的名称.
  • ManyToOne始终是双向关联的拥有方.
  • OneToMany始终是双向关联的反面.

此外:

如果你创建一个$user = new User()尚未由doctrine管理的新的根实体(即),你只需要调用persist($myFirstComment如果你已经正确设置了cascade选项,你就不必在你的例子中调用persist ).

否则,如果实体由于某种原因未被分离,您只需要调用flush.

  • 由于级联操作仅观察拥有方的变化 - 您能解释一下在拥有方和相反方设置级联操作的区别吗?双方都有级联选项,我不明白为什么只有一个观看方。 (2认同)