Как заставить Doctrine MongoDB ODM Document Proxy преобразовать в «оригинальный» документ? - PullRequest
7 голосов
/ 08 июня 2011

У меня есть документ Лицо, указанное в документе Пользователь. Когда я извлекаю пользователя, в него встроен не объект Person, а прокси-объект Person. Есть ли способ «заставить» прокси стать «полным» документом (так Person proxy => Person).

Я пытался вызвать метод для получения дополнительных данных (поэтому __load срабатывает, но объект остается версией прокси.

Я надеюсь, что кто-то может пролить больше света на это, чем документация ODM.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2013

Вам не нужно извлекать исходный объект, поскольку класс Proxy должен быть на 100% прозрачным для вашего кода.

Если вам нужно сериализовать документ, например, чтобы отправить его через API, обязательно правильно внедрите метод serialize() в вашем документе.

Если вам все еще нужно получить ссылочный документ без прокси, вы можете либо prime(), либо получить его с помощью отдельного запроса, указав hydrate(false):

$user = $dm->createQueryBuilder('Person')
            ->field('_id')->equals($user->getPerson()->getId())
            ->hydrate(false)

См: Doctrine ODM Doc: Отключение гидратации для получения дополнительной информации.

2 голосов
/ 01 апреля 2012

Это можно сделать с помощью Ссылок на прокачку .

Пример документов:

/** @Document */
class User
{
    /** @ReferenceOne(targetDocument="Person") */
    private $person;
}

/** @Document */
class Person
{
    // ...
}

Использование QueryBuilder:

/* @var $user User */
$user = $dm->createQueryBuilder('User')
    ->field('person')->prime(true)
    ->getQuery()
    ->getSingleResult();
...