学说多对多的缺陷


Doctrine Many to Many flaws

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

我有两个实体类,比如Author和Book。我的假设是,一本书可以由许多作者写,所以作为所有者,这将是一种多对多的关系。现在我想有一个操作,我可以创建新书,并立即将其分配给现有作者,而且我知道作者的id,所以不需要从数据库中实际选择作者。所以我可以尝试:

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

上面的代码有什么问题?假设这个关系具有cascade="persistent"。若你们中的任何人尝试这样做,你们会得到非常奇怪的结果:这本书将被添加到数据库中,但关系不会被保存,因为部分引用在原则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(),在这种情况下显然是无用的。

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

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

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