1

在 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 的所有内部方法。

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

4

1 回答 1

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;
}
于 2013-03-16T06:51:38.547 回答