教义有很多很多缺陷

时间:2013-12-10 11:38:38

标签: php sql symfony orm doctrine

我遇到了以下问题,我看不到任何解决方案(分析了学说源代码后更不可能)。问题如下:

我有两个实体类,让我们说作者和书。我的假设是,一本书可以由许多作者撰写,因此与作为所有者的作者将是多对多的关系。 现在我希望有一个动作,我可以创建新书并立即将其分配给现有作者,我知道作者的ID,因此不需要从数据库中实际选择作者。所以我可以尝试:

$book = new Book();
//assign data to book
$author = $em->getPartialReference('Author', $idOfAuthor);
$author->addBook($book);
$em->persist($author);
$em->flush();

上述代码有什么问题?假设关系有cascade =“persist”。如果你们中的任何人都试图这样做,你会得到非常奇怪的结果:书籍将被添加到数据库中,但是关系将不会被保存,因为部分参考在教义UnitOfWork中被标记为readOnly而且因为该学说不会保存对其进行的任何修改但由于某种原因它将遵循级联持久性。

所以我们可以尝试不同的方法:

$book = new Book();
//assign data to book
$author = $em->getReference('Author', $idOfAuthor);
$author->addBook($book); //here's problematic line
$em->persist($author);
$em->flush();

那个可以工作,但它会选择作者的所有数据,我已经评论为“有问题”,因为作为参考提供的代理类将延迟加载对作者执行的任何方法调用的所有属性例外,它是getId(),在这种情况下显然无用。

所以我的问题是: 我错了吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

没有。你没有错过任何东西。第二个样本是正确的。 :)

我相信你所看到的是当你刷新更新事务时它仍然首先执行一个select语句来检索相关记录。从SQL的角度来看,这是低效的,但是Doctrine的工作方式。