Как сохранить документ внутри другого документа с помощью Doctrine ODM?

Как сохранить документ внутри другого документа с помощью Doctrine ODM?

Я не вижу в документации тип Array или Json.

Я хотел бы иметь возможность сделать что-то вроде этого:

class Post {

    /**
     * @MongoDB\String
     */
    protected $body;

    /**
     * @MongoDB\Array
     */
    protected $comments = array();

}

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


person HappyDeveloper    schedule 27.11.2011    source источник


Ответы (3)


/**
 * @MongoDB\Document
 */
class Post
{
    /**
     * @MongoDB\Id
     */
    private $id;

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

    /**
     * @MongoDB\EmbedMany(targetDocument="Comment")
     */
    private $comments;

    public function __construct()
    {
        $this->comments = new ArrayCollection();
    }
}

/**
 * @MongoDB\EmbeddedDocument
 */
class Comment
{
    /**
     * @MongoDB\String
     */
    private $body;
}

Но обратите внимание, что комментарии не являются хорошими кандидатами для встраивания — в отличие, вероятно, от самого популярного примера встраивания в MongoDB. Я тоже начинал с комментариев в качестве встраивания, но потом столкнулся с некоторыми проблемами и решил хранить их в отдельной коллекции. Всех проблем не помню, но главной была невозможность сортировки комментариев на стороне БД. Быстрое решение состояло в том, чтобы отсортировать их на стороне клиента, но когда дело доходит до нумерации страниц, она просто не масштабируется.

person Elnur Abdurrakhimov    schedule 28.11.2011
comment
Я пробовал это, прежде чем спрашивать, но он сказал, что ArrayCollection() недействителен или что-то в этом роде. Дай мне проверить - person HappyDeveloper; 29.11.2011
comment
Класс Doctrine\Common\Collections\ArrayCollection не является допустимым документом или сопоставленным суперклассом. - person HappyDeveloper; 29.11.2011
comment
Вы пробовали очистить кеш? В MongoDBBundle есть некоторые проблемы с кешем, поэтому иногда вам нужно очистить его, даже когда вы находитесь в среде разработки. - person Elnur Abdurrakhimov; 29.11.2011
comment
Кстати, я надеюсь, что класс Comment полностью соответствует этой аннотации @MongoDB\EmbedMany(targetDocument="Comment") в вашем коде. Должно быть что-то вроде @MongoDB\EmbedMany(targetDocument="VendorName\BundleName\Document\Comment"). - person Elnur Abdurrakhimov; 29.11.2011
comment
Да, я заметил, что мне приходилось использовать полные имена классов. - person HappyDeveloper; 29.11.2011
comment
Думаю о переходе на пропел или манданго. Вы их пробовали? - person HappyDeveloper; 29.11.2011
comment
Я ничего не слышал о манданго, но лично мне не нравится Propel, потому что он все еще в эре ActiveRecord. - person Elnur Abdurrakhimov; 29.11.2011
comment
Да, мне тоже не нравится, по той же причине. знак равно - person HappyDeveloper; 29.11.2011

Я думаю, это то, что вы ищете: http://www.doctrine-project.org/docs/mongodb_odm/1.0/en/reference/embedded-mapping.html

person GGGforce    schedule 28.11.2011

В моем __construct() мне нужно

new \Doctrine\Common\Collections\ArrayCollection();

где у тебя только что

new ArrayCollection();
person Adam Knowles    schedule 06.02.2012