Пользовательский репозиторий Symfony2, отложенная загрузка и прокси-объекты

У меня возникли проблемы с извлечением связанных объектов из моей базы данных с помощью Doctrine2 в Symfony2. У меня есть собственный репозиторий со следующей функцией:

public function getOrder($id) {
    $DQL = 'SELECT request, orderer
    FROM OrderRequestBundle:OrderRequest request
    JOIN request.orderer orderer
    WHERE request.id = :id';

    $query = $this->getEntityManager()->createQuery($DQL)
                ->setParameter('id', $id)
                ->setMaxResults(1);
    return $query->getResult();
}

... но по какой-то причине, когда я запускаю эту функцию, я получаю прокси-объект для объекта OrderRequest, а не реальный экземпляр OrderRequest, я что-то упустил? Кажется, что Doctrine2 любит ленивую загрузку, и я не могу заставить его подняться и получить объекты для меня.

ОБНОВЛЕНИЕ: я пытаюсь просто отобразить информацию в шаблоне Twig с помощью кода ниже:

$order = $this->getDoctrine()
    ->getRepository('OrderRequestBundle:OrderRequest')
    ->getOrder($id);

return $this->render('OrderRequestBundle:Admin:view.html.twig', array('order' => $order));

Где Twig вызывает информацию о переменной «order» следующим образом:

{{ order.quantity }}

... но я просто получаю эту ошибку:

Item "quantity" for "Array" does not exist in "OrderRequestBundle:Admin:view.html.twig" at line 5

person celestialorb    schedule 24.10.2011    source источник
comment
По какой причине вам не нужен экземпляр прокси?   -  person Derek Stobbe    schedule 25.10.2011
comment
Я пытаюсь получить информацию об объекте OrderRequest для отображения на странице (через шаблон Twig), но постоянно получаю сообщение об ошибке, что свойства объекта не существуют. Я обновлю вопрос, чтобы отразить это.   -  person celestialorb    schedule 27.10.2011


Ответы (2)


ОБНОВЛЕНИЕ

Учитывая ваше редактирование, проблема вовсе не в прокси-объектах, а в том, как вы используете свой объект $query.

$query->getResult() вернет массив результатов. В таком случае, когда вы ограничиваете результирующий набор максимум 1 строкой, он вернет массив с одной записью, но все же массив. Естественно, Twig задыхается от этого при попытке использовать методы доступа.

Вместо этого вы захотите использовать $query->getSingleResult(). Обратите внимание, что Doctrine выдаст исключение неуникального результата, если запрос вернет более одной строки, поэтому вам нужно обязательно использовать его с setMaxResults(1), как вы делаете, если запрос может вернуть несколько результатов.

ЗАВЕРШИТЬ ОБНОВЛЕНИЕ

Из документации по эталонным прокси:

Здесь $item на самом деле является экземпляром прокси-класса, который был сгенерирован для класса Item, но вашему коду это не нужно. На самом деле это не должно волновать. Прокси-объекты должны быть прозрачными для вашего кода.

Акцент их. Прокси-серверы должны быть прозрачными для вашего кода и существовать для повышения производительности, где это возможно; однако, если у вас есть острая необходимость загрузить часть запроса, вы можете либо установить режим выборки в файле конфигурации вашего объекта, либо проверить этот раздел документов:

$query = $em->createQuery("SELECT u FROM MyProject\User u");
$query->setFetchMode("MyProject\User", "address", "EAGER");
$query->execute();
person Derek Stobbe    schedule 24.10.2011
comment
Спасибо! Я предположил, что $query->getSingleResult() даст те же результаты, что и $query->setMaxResults(1), за которой следует $query->getResult(). Это помогло. :D - person celestialorb; 27.10.2011

Doctrine2 всегда возвращает прокси-объекты из запросов к репозиторию. Они расширяют ваши классы сущностей и для всех намерений и целей являются одним и тем же.

Прокси просто позволяют вашим сущностям поддерживать ленивую загрузку связанных сущностей (среди прочего).

См. http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html?highlight=proxy#entity-object-graph-traversal

person Phil    schedule 24.10.2011