预加载Doctrine ODM引用的文档

时间:2013-06-17 09:04:29

标签: php mongodb doctrine-orm doctrine-odm

我正在使用Doctrine ODM(MongoDB),我有类似下面的内容

  • Attendee文件
  • Answer文件
  • 每个Answer引用一个Attendee。 (一对多的关系)

我做了类似下面的事情

attendees = attendeeRepo.findby(whatever)

foreach(attendees as attendee)
    answers = attendee.getAnswers()

这里的问题是每个attendee.getAnswers() Doctrine ODM都会执行如下查询:

db.TicketAnswer.find({ 
    "attendee.$id": ObjectId("50ae80608ead0ea71e00008b") 
})

如果我有100个参加者,那么会有100个这样的查询被执行,所以我试图在循环之前预加载所有Answers。但它并没有像我预期的那样有效。

我想它没有像我期望的那样工作,因为这是一对多的关系,我问关系的一方(Attendee)加载了很多(Answer )。在其他情况下,当我正在做相反的事情时,预加载按预期工作。

我不确定这种情况的最佳解决方案是什么。希望有人有想法可以提供帮助。

1 个答案:

答案 0 :(得分:0)

查看此文章: http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/priming-references.html

引用:

/** @Document */
class User
{
    /** @ReferenceMany(targetDocument="Account") */
    private $accounts;
}

-

$qb = $dm->createQueryBuilder('User')
    ->field('accounts')->prime(true)
    ->limit(100);
$query = $qb->getQuery();
$users = $query->execute();