我很难理解 Doctrine 手册的 explanation 级联操作,需要有人帮助我理解简单的多对一关系中的选项。
在我的应用程序中,我有一个名为 Article 的表/实体,它有一个引用名为 Topic 的表/实体中的“id”字段的外键字段。
创建新文章时,我从下拉菜单中选择主题。这将一个整数插入到文章表中的“topic_id”外键字段中。
我在文章实体中设置了 $topic 关联,如下所示:
/**
* @ManyToOne(targetEntity="Topic")
* @JoinColumn(name="topic_id", referencedColumnName="id", nullable=false)
*/
private $topic;
Topic 实体没有任何关于 Article 实体的往复注释。主题不关心哪些文章引用了它们,当删除引用该主题的文章时,主题不需要发生任何事情。
因为我没有在文章实体中指定级联操作,所以当我尝试创建新文章时,Doctrine 会抛出错误:“通过未配置为级联持久操作的关系找到了新实体。显式持久化新实体或在关系上配置级联持久操作。”
所以我知道我需要选择一个级联操作来包含在 Article 实体中,但是我怎么知道在这种情况下选择哪个操作呢?
通过阅读 Doctrine 手册,“分离”听起来是正确的选择。但是研究其他人的类似问题 here 和 here 让我觉得我想改用“坚持”。
任何人都可以帮助我理解“持久化”、“删除”、“合并”和“分离”在我所描述的简单多对一关系中的含义吗?
最佳答案
在 Doctrine2 文档“9.6. Transitive persistence / Cascade Operations”中,很少有示例说明如何配置实体,以便在持久化 $article 时,也会持久化 $topic。在您的情况下,我建议为 Topic 实体添加此注释:
/**
* @OneToMany(targetEntity="Article", mappedBy="topic", cascade={"persist", "remove"})
*/
private $articles;
此解决方案的缺点是您必须将 $articles 集合包含到 Topic 实体中,但您可以将其设为私有(private)而不使用 getter/setter。
正如@kurt-krueckeberg 所提到的,您必须在创建新文章时传递真实的主题实体,即:
$topic = $em->getRepository('Entity\Topic')->find($id);
$article = new Article($topic);
$em->persist($article);
$em->flush();
// perhaps, in this case you don't even need to configure cascade operations
祝你好运!
关于doctrine-orm - OneToMany 的 Doctrine 级联选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7709293/