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)
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)
| 归档时间: |
|
| 查看次数: |
6777 次 |
| 最近记录: |