【问题标题】:Using Doctrine, how do you access Entity methods from a EntityRepository?使用 Doctrine,您如何从 EntityRepository 访问 Entity 方法?
【发布时间】:2013-03-16 14:51:38
【问题描述】:

在 Symfony 的“书”中,他们讨论了引用其他实体的实体。比如,就我而言,如果我有一个“帖子”实体,其中有许多“评论”实体引用它,我可以通过其 ID 加载帖子,然后执行 $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 的所有内部方法。

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

【问题讨论】:

    标签: symfony controller symfony-2.1


    【解决方案1】:

    我相信你有一个错字:)。查看代码的第一行。你有一个return声明!因此,您返回 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;
    }
    

    【讨论】:

    • Welp,你做到了!太感谢了。现在你也想来写我剩下的程序吗? :-D 干得好。
    • 我知道这种“错误”有多可怕。你扯掉你的头发,你只是没有注意到它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2015-03-20
    • 2020-06-27
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多