9

有人可以解释一下吗:

$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,存在关系时无法插入数据库

4

1 回答 1

19

要让 Doctrine 自动处理您的User#comments属性的持久性,您必须将级联设置为“持久”操作。

级联(persist、remove、merge、all)选项使您能够省略...

$em->persist($myFirstComment);

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

例子:

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

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

请记住:

Doctrine 只会检查关联的拥有方是否有更改。

仅对关联的反面所做的更改将被忽略。确保更新双向关联的双方(或至少从 Doctrine 的角度来看拥有方)

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

此外:

如果您创建一个$user = new User()尚未由学说管理的新根实体(即),您只需调用persist($myFirstComment如果您正确设置了级联选项,则不必在示例中调用persist on)。

否则,如果实体由于某种原因没有被分离,你只需要调用flush。

于 2013-05-23T07:23:45.410 回答