Ссылка Doctrine Mongo ODM 3 коллекции

Привет, я пытаюсь сослаться на 3 коллекции, но мне не удается сослаться на 2 > 3 ссылки, позвольте мне объяснить, что я пытаюсь сделать.

У меня есть класс User, в котором есть справочные сообщения referenceMany > Posts, а в сообщениях у меня есть 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>";
}

один из документов выглядит так для комментариев:

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

Вопрос в том, почему я получаю 0 баллов за комментарий, когда пытаюсь получить их для определенного сообщения, но когда я пытаюсь получить сообщения от пользователя, я могу их получить.


person Emrah Mehmedov    schedule 13.09.2012    source источник


Ответы (1)


Потому что все, что возвращает getComments(), — это курсор на эту коллекцию. Doctrine не будет выполнять никаких запросов для получения информации, пока вы не начнете перебирать эту коллекцию.

Добавьте это к запросу в методе getWallPostById.

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

Это скажет доктрине получать данные о комментариях, когда вы получаете сообщение, и тогда ваш курсор из getComments должен иметь информацию о подсчете, которую вы ищете.

Основные ссылки

person Jamie Sutherland    schedule 14.09.2012
comment
Вы говорите, что я должен создать собственный запрос для этого? как насчет «количества эхо($post-›getComments());» добытчик - person Emrah Mehmedov; 18.09.2012
comment
Похоже, у вас уже есть запрос внутри getWallPostById? возможно, внутри класса репозитория? Я говорю, что если вы добавите основной выбор в свой запрос, он скажет доктрине получить всю информацию об этой ссылке по первому запросу, а не ждать, пока вы захотите получить доступ к этой ссылке. Вот почему ваш 'echo count($post->getComments());' не работает с первого раза, потому что без основной операции у него нет информации о комментариях. Если вы повторите это после своего оператора foreach, я думаю, вы получите ожидаемый ответ, потому что вы использовали ссылку - person Jamie Sutherland; 18.09.2012
comment
но это всегда будет загружать комментарии с сообщениями, и это не будет ленивой загрузкой, верно? Вместо этого get references загрузит все комментарии ко всем сообщениям. - person Emrah Mehmedov; 18.09.2012
comment
Правильный. Если вы знаете, что собираетесь перебирать все комментарии, вам следует использовать Prime, чтобы получить всю необходимую информацию за два обращения к БД. В противном случае это #comments+1 поездка. Если вы все еще хотите подсчитать количество комментариев, прежде чем отправиться в БД за комментарием, вам придется сохранить количество комментариев в почтовом документе. Это приводит к большему количеству записей, поскольку вам придется обновлять сообщение для каждого комментария. - person Jamie Sutherland; 18.09.2012
comment
Я просто перечитал вопрос. Нет, будут загружены только все комментарии, которые ссылаются на этот пост. Если вы знаете, что собираетесь использовать метод getComments после того, как найдете этот пост. Вы должны использовать основной вариант, так как это наиболее оптимальный способ вернуть данные в ваше приложение. - person Jamie Sutherland; 18.09.2012