0

こんにちは、3 つのコレクションを参照しようとしていますが、2 > 3 の参照に失敗しました。何をしようとしているのか説明させてください。

私はリファレンス投稿 referenceMany > Posts を持つ User クラスを持っており、投稿には referenceMany > コメントがあります。

: Doctrine Mongo ODM + Zend Framework 2

ユーザーが投稿を書き、誰かがコメントするようなものです。

/** @MongoDB\Document */
class Users {

    /** @MongoDB\ReferenceMany(targetDocument="Posts", mappedBy="user") */
    private $posts;

}

/** @MongoDB\Document */
class Posts {

    /** @MongoDB\Id */
    private $wallPostId;

    /** @MongoDB\ReferenceOne(targetDocument="Users", inversedBy="posts") */
    private $user;

    /** @MongoDB\ReferenceMany(targetDocument="Comments", mappedBy="post") */
    private $comments;

    /** @MongoDB\String */
    private $content;

}

/** @MongoDB\Document */
class Comments {

    /** @MongoDB\Id */
    private $commentId;

    /** @MongoDB\ReferenceOne(targetDocument="Posts", inversedBy="comments") */
    private $post;

    /** @MongoDB\String */
    private $content;

}

このコードを試して、投稿からすべてのコメントを取得しています

$post = $wallPostsAction->getWallPostById("5051d2a1e71a382c1b000000");
$output = "";
$output .= "Wall post content: " . $post->getContent() . "<br>";
//      $comment = new Comments();
//      $comment->setContent("Nice topic!");
//      $comment->setPost($post);
//      $this->dm->persist($comment);
//      $this->dm->flush();

echo count($post->getComments());
foreach($post->getComments() as $comment){
    $output .= " comment: " . $comment->getComment() . "<br>";
}

ドキュメントの 1 つは、コメントとして次のようになります。

{
   "_id": ObjectId("---"),
   "post"?: {
     "$ref": "Posts",
     "$id": ObjectId("---"),
     "$db": "db" 
  },
   "content": "Nice topic!" 
}

質問は、特定の投稿に対してコメントを取得しようとすると、コメントのカウントが0になるのですが、ユーザーから投稿を取得しようとすると取得できるのはなぜですか。

4

1 に答える 1

0

getComments() が返すのは、そのコレクションへのカーソルだけだからです。Doctrine は、そのコレクションの反復を開始するまで、情報を取得するためのクエリを実行しません。

これを getWallPostById メソッドのクエリに追加します。

->field('comments')->prime(true)

これにより、投稿を取得するときにコメントに関するデータを取得するようにDoctrineに指示され、 getComments からのカーソルには、探しているカウント情報が含まれているはずです。

プライミング リファレンス

于 2012-09-14T14:15:01.140 に答える