У меня есть два документа: Вопрос и Ответ. Класс 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'
Этот запрос вернет ожидаемый объект - один ответ - к моему большому удивлению.
Итак, у меня вопрос: чего мне не хватает?
Я бы предпочел не "встраивать" мои документы, хотя я читал, что таким образом проще запрашивать встроенные документы. Может быть, я смогу вставить вопрос в ответ.