2012-01-24 11 views
0

質問と回答の2つのドキュメントがあります。 Questionクラスの$answersプロパティは@MongoDB\ReferenceMany(targetDocument="Answer", cascade="all")と定義されています。 Answerクラスの$questionプロパティは@MongoDB\ReferenceOne(targetDocument="Question")と定義されています。どちらのクラスもプロパティは@MongoDB\Idと定義されています。私は単一の質問のためのすべての答えの部分配列を返す必要がReferenceInceドキュメントの照会ObjectId()は1つのみではありません。

は、10

のグループで、私はすべての変化の結果で、多くの異なるアプローチを試みたと言います。どんなアプローチでも私が必要とするものが得られませんでした。一度私の答えではなく、10を得ることができます。質問レポ

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

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

の照会


。このクエリは、空のオブジェクトを返す

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

回答レポを照会

(バージョン1)。このクエリは、あまりにも空のオブジェクトを返します

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

回答レポを照会

(バージョン2)。このクエリは、あまりにも空のオブジェクトを返します

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

回答レポを照会

(バージョン3)。私の大きな驚きに - 単一回答 -

は、このクエリ期待されるオブジェクトを返します回答レポ(バージョン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' 

の照会。


私の欠点は何ですか?

私は自分のドキュメントを「埋め込む」ことを好まないと思っていますが、埋め込まれたドキュメントをそのように照会する方が簡単だと読んだことがあります。たぶん私は答えに質問を埋め込むことができます。

答えて

2

Query::execute()DocumentRepository::findBy()の結果は、オブジェクト内に実際のデータが含まれないようにカーソルを返します。あなたはそれが空であると確信していますか? $ answerを反復処理するか、$answers->count()を実行するとうまくいくはずです。

+0

おっと、それは面白いです。今すぐテストするまで待つ必要があります。 – allnightgrocery

+0

私は愚かなことは適切にデバッグしていないと感じます。これがCursorであることを見ていれば、私は単純に 'toArray()'を追加してレースに出てしまいました。ありがとうございました。 – allnightgrocery

関連する問題