2013-06-17 1 views
0

Я использую Doctrine ODM (MongoDB) и у меня есть что-то вроде следующегоПредварительной загрузка Doctrine ODM ссылочных документов

  • 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). в других случаях, когда я делаю обратное, предварительная загрузка работает, как ожидалось.

Я не уверен, что является лучшим решением для такого случая. если у кого есть идеи, которые могут помочь.

ответ

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(); 
+0

спасибо, но пробовали его раньше. он работает только в том случае, о котором вы упомянули '@ReferenceMany (targetDocument =" Учетная запись ")' , но не работает для '@ReferenceMany (targetDocument =" Account ", mappedBy =" user ")' – Shreef