Symfony2自定义存储库,延迟加载和代理对象

cel*_*orb 2 repository dql symfony doctrine-orm

我在使用Symfony2中的Doctrine2从数据库中提取关系对象时遇到了一些麻烦.我有一个具有以下功能的自定义存储库:

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();
}
Run Code Online (Sandbox Code Playgroud)

...但由于某种原因,当我运行此函数时,我得到一个OrderRequest对象的Proxy对象而不是OrderRequest的真实实例,我错过了什么?似乎Doctrine2喜欢懒惰加载,我似乎无法从它的屁股上取下它并为我取物.

更新:我试图在Twig模板中显示信息,代码如下:

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

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

其中Twig调用有关'order'变量的信息,如下所示:

{{ order.quantity }}
Run Code Online (Sandbox Code Playgroud)

...但我最终得到了这个错误:

Item "quantity" for "Array" does not exist in "OrderRequestBundle:Admin:view.html.twig" at line 5
Run Code Online (Sandbox Code Playgroud)

Pro*_*tic 8

UPDATE

鉴于您的编辑,问题根本不是代理对象,而是您使用$ 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();
Run Code Online (Sandbox Code Playgroud)