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

У меня возникли проблемы с извлечением связанных объектов из моей базы данных с помощью 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();
}

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

UPDATE: Я пытаюсь просто отобразить информацию в шаблоне 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

Ответы [ 2 ]

8 голосов
/ 25 октября 2011

ОБНОВЛЕНИЕ

Учитывая ваше редактирование, проблема вовсе не в прокси-объектах, а в том, как вы используете объект $ 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();
1 голос
/ 25 октября 2011

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

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

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

...