2013-03-16 74 views
1

在Symfony的“书”中,他们讨论实体并引用其他实体。就我而言,如果我有一个带有许多引用它的“Comment”实体的“Post”实体,我可以通过它的ID加载Post,然后执行$ post-> getComments()。使用Doctrine,您如何从EntityRepository中访问实体方法?

评论是懒惰加载,看来,我将不得不逐一通过他们,加载每个(这显然是错误的)或加载它们在一个单独的查询(我可以做的,但我不知道在哪里,具体来说,把这个查询)。 The Book, however, suggests:“当然,如果您知道前台需要访问这两个对象,则可以通过在原始查询中发出连接来避免第二个查询。”它建议我向我的(当前为空)postRepository类添加一个方法。我做的,它看起来像这样:

public function loadPostFull($pid) 
{ 
    return $this->getEntityManager() 
     ->createQuery(' 
      SELECT p, c FROM BUNDLENAME:Post p 
      JOIN p.comments c 
      WHERE p.id = :id') 
     ->setParameter('id', $pid); 
    try { 
     return $query->getSingleResult(); 
    } catch (\Doctrine\ORM\NoResultException $e) { 
     return null; 
    } 
} 

然后在我的控制器我做的:

$fullPost = $this->getDoctrine() 
      ->getRepository('BUNDLENAME:Post') 
      ->loadPostFull($id); 
$id = $fullPost->getId(); 

但是我的$ ID简单的要求提供了一个“致命错误:调用未定义的方法原则\ ORM \查询::的getId()”。我知道控制器正确地找到了loadPostFull方法,因为如果我打错了名字,它将会在那里失败。这只是没有返回一个适当的邮政实体。如果我改变控制器来调用 - > find($ id)而不是 - > loadPostFull($ id),我可以使用Post id的所有内部方法。

该手册似乎表明我可以做到这一点!怎么了?

回答

2

我相信你有一个错字:)。看看你的代码的第一行。你有一个返回声明!因此,您返回Query对象并尝试{} catch(){}永远不会到达。你应该把这样的:

$query = $this->getEntityManager() 
    ->createQuery(' 
     SELECT p, c FROM BUNDLENAME:Post p 
     JOIN p.comments c 
     WHERE p.id = :id') 
    ->setParameter('id', $pid); 
try { 
    return $query->getSingleResult(); 
} catch (\Doctrine\ORM\NoResultException $e) { 
    return null; 
} 
+0

韦尔普,你做到了!非常感谢。现在你想来写我的程序的其余部分吗? :-伟大的工作。 – Offlein 2013-03-16 15:09:07

+0

那么我知道这些“错误”可能会有多糟糕。你脱下你的头发,你只是没有注意到它:) – Viorel 2013-03-17 08:29:49

相关问题