在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的所有内部方法。
该手册似乎表明我可以做到这一点!怎么了?
韦尔普,你做到了!非常感谢。现在你想来写我的程序的其余部分吗? :-伟大的工作。 – Offlein 2013-03-16 15:09:07
那么我知道这些“错误”可能会有多糟糕。你脱下你的头发,你只是没有注意到它:) – Viorel 2013-03-17 08:29:49