使用Doctrine,如何从EntityRepository访问Entity方法?

时间:2013-03-16 06:37:20

标签: symfony controller symfony-2.1

在Symfony“Book”中,他们通过引用其他实体来讨论实体。就像在我的情况下,如果我有一个“Post”实体,其中有很多“评论”实体引用它,我可以通过其ID加载Post,然后执行$ post-> getComments()。

注释似乎是懒惰的,我不得不逐个通过它们,加载每个(显然是错误的)或者将它们全部加载到一个单独的查询中(我可以做,但我不知道在哪里,特别是,把那个查询)。 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的简单请求给出了“致命错误:调用未定义的方法Doctrine \ ORM \ Query :: getId()”。我知道控制器正在正确地找到loadPostFull方法,因为如果我输入错误名称,它将在那里失败。它只是没有返回一个合适的Post实体。如果我将控制器更改为调用 - > find($ id)而不是 - > loadPostFull($ id),我可以使用Post id的所有内部方法。

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

1 个答案:

答案 0 :(得分: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;
}