【问题标题】:How to use the cascade option in Doctrine2 to have associated entities automatically persisted?如何使用 Doctrine2 中的级联选项自动持久化关联实体?
【发布时间】:2013-05-18 00:15:32
【问题描述】:

谁能给我解释一下:

$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 有点愚蠢。

我不明白。任何帮助表示赞赏。

这与此相关:doctrine 2, unable to insert to database when relation is present

【问题讨论】:

  • 换句话说,如果我有级联,为什么我必须调用其他实体的引用?
  • 长话短说:如果我有从一个实体到另一个实体的关联,我必须在插入/更新时始终调用另一个实体。我不能说$user->addComment("some comment"),我必须先调用relation,然后再调用$user->addComment("some comment")。这是有道理的,但它有点愚蠢。如果我有 50 个关系怎么办?在插入/更新时调用每个关系?教义非常适合选择,但如果你有关系,它对其他一切都很糟糕。我必须做 50 次 $this->em->getReference('entity name') .....
  • 我已经通过大量解释和文档提示回答了您的问题 + 附加了代码示例。如果对您有帮助,请接受答案:)

标签: php symfony zend-framework orm doctrine-orm


【解决方案1】:

要让 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 关联永远不是拥有方。
  • 反面必须使用 OneToOne、OneToMany 或 ManyToMany 映射声明的 mappedBy 属性。 mappedBy 属性包含拥有方的关联字段的名称
  • 拥有方必须使用 OneToOne、ManyToOne 或 ManyToMany 映射声明的 inversedBy 属性。 inversedBy 属性包含反面关联字段的名称。
  • ManyToOne 始终是双向关联的拥有方。
  • OneToMany 始终是双向关联的反面。

此外:

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

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

【讨论】:

  • 由于级联操作只关注拥有方的变化 - 你能解释一下在拥有方和相反方设置级联操作的区别吗?双方都有级联选项,我不明白为什么只有一个观看方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2012-05-31
  • 2021-02-25
  • 2011-03-12
相关资源
最近更新 更多