在 Symfony 的“书”中,他们讨论了引用其他实体的实体。比如,就我而言,如果我有一个“帖子”实体,其中有许多“评论”实体引用它,我可以通过其 ID 加载帖子,然后执行 $post->getComments()。
评论似乎是延迟加载的,我必须一个接一个地通过它们,加载每个(这显然是错误的)或将它们全部加载到一个单独的查询中(我可以这样做,但我没有'不知道在哪里,具体来说,把那个查询)。然而,这本书建议:“当然,如果您事先知道您需要访问这两个对象,您可以通过在原始查询中发出联接来避免第二次查询。” 它建议我向我的(当前为空的)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 的简单请求给出了“致命错误:调用未定义的方法 Doctrine\ORM\Query::getId()”。我知道控制器正确地找到了 loadPostFull 方法,因为如果我输入了名称,它将在那里失败。它只是没有返回正确的 Post 实体。如果我将控制器更改为调用 ->find($id) 而不是 ->loadPostFull($id) 我可以使用 Post id 的所有内部方法。
手册似乎表明我可以做到这一点!怎么了?