有人可以解释一下:
$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();
为什么我在尝试插入数据库时必须调用实体注释?
我有级联。
如果我必须手动调用所有关系,那么使用Doctrine是一种愚蠢的行为。
我不懂。任何帮助表示赞赏。
这与此相关:doctrine 2, unable to insert to database when relation is present
答案 0 :(得分:19)
要让Doctrine自动处理User#comments
属性的持久性,您必须将级联设置为“持久”操作。
级联(持久,删除,合并,全部)选项使您能够省略...
$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的角度更新所有方)
mappedBy
属性。 mappedBy
属性包含拥有方的关联字段的名称inversedBy
属性。 inversedBy
属性包含反面的关联字段的名称。此外:
如果您创建一个尚未由学说管理的新根实体(即$user = new User()
),您只需要调用persist(并且您不必在示例中调用$myFirstComment
上的persist如果你正确设置了级联选项)。
否则,如果实体由于某种原因没有被分离,你只需要调用flush。