Запрос документов ReferenceOnce с помощью ObjectId () работает для одного, но не для многих - PullRequest
0 голосов
/ 24 января 2012

У меня есть два документа: Вопрос и Ответ. Класс Question имеет свойство $answers, определенное как @MongoDB\ReferenceMany(targetDocument="Answer", cascade="all"). Класс Answer имеет свойство $question, определенное как @MongoDB\ReferenceOne(targetDocument="Question"). Оба класса имеют свойство $id, определенное как @MongoDB\Id.

Мне нужно вернуть частичный массив всех ответов на один вопрос, скажем, группами по 10.

Я пробовал несколько разных подходов, все с разными результатами. Ни один из подходов не дал того, что мне нужно.


Запрос на репо

$question = $this->getDocumentManager()
  ->getRepository(self::QUESTION_REPO)
  ->find($id);

$answers = array($questions->getAnswers());

Это даст мне ответы, но не 10 одновременно.

Запрос репо (версия 1)

$question = $this->getQuestion($id); // works just fine
$answers = $this->getDocumentManager()
  ->createQueryBuilder(self::ANSWER_REPO)
  ->field('question.$id')->equals(new \MongoId($question->getId()))
  ->getQuery()
  ->execute();

Этот запрос вернет пустой объект.

Запрос репо (версия 2)

$question = $this->getQuestion($id);
$answers = $this->getDocumentManager()
  ->createQueryBuilder(self::ANSWER_REPO)
  ->field('question')->references($question)
  ->getQuery()
  ->execute();

Этот запрос также вернет пустой объект.

Запрос репо (версия 3)

$question = $this->getQuestion($id);
$answers = $this->getDocumentManager()
  ->getRepository(self::ANSWER_REPO)
  ->findBy(array('question.id' => $question->getId()));

Этот запрос также вернет пустой объект.

Запрос репо (версия 4)

$question = $this->getQuestion($id);
$answer = $this->getDocumentManager()
  ->getRepository(self::ANSWER_REPO)
  ->findOneBy(array('question.id' => $question->getId()));
  // note: 'question.id' and not 'question.$id'

Этот запрос вернет ожидаемый объект - один ответ - к моему большому удивлению.


Итак, у меня вопрос: чего мне не хватает?

Я бы предпочел не "встраивать" мои документы, хотя я читал, что таким образом проще запрашивать встроенные документы. Может быть, я смогу вставить вопрос в ответ.

1 Ответ

2 голосов
/ 24 января 2012

Результат Query::execute() и DocumentRepository::findBy() вернет курсор, поэтому он не будет содержать никаких реальных данных внутри объекта.Вы уверены, что он пуст?Если вы начинаете перебирать ответы $ или делаете $answers->count(), это должно сработать.

...