【问题标题】:Doctrine 2, undefined entity method findOneBy*教义 2,未定义的实体方法 findOneBy*
【发布时间】:2025-12-23 02:25:06
【问题描述】:

我有一个奇怪的问题。这是错误消息:

调用未定义的方法MyProject\BlogBundle\Entity\Blog::findOneById()

我已经设置了映射,实体类是使用控制台创建的,并且我已经更新了数据库中的模式。什么可能导致此问题?

我正在使用 symfony2。这是一行:

$blogRepo = $this->get('myproject.blog.repository.blog');  
$blog = $blogRepo->findOneById($id);  

有什么想法吗?

【问题讨论】:

    标签: doctrine-orm symfony


    【解决方案1】:

    myproject.blog.repository.blog的服务定义是什么?看起来您正在将其映射到 MyProject\BlogBundle\Entity\Blog,而它实际上应该是 MyProject\BlogBundle\Entity\BlogRepository

    除了创建自己的 Repository 类之外,您还可以由 EntityManager 动态创建一个。

    $user = $em->getRepository('MyProject\Domain\User')->find($id);
    

    甚至更短:

    $user = $em->find('MyProject\Domain\User', $id);
    

    取自the Doctrine2 ORM Documentation

    【讨论】:

    • 我想了解您所说的MyProject\Domain\* 是什么意思这是Entity 类吗?
    • 是的,MyProject\Domain\User 是一个实体。
    【解决方案2】:

    findOneById 不存在,试试

    $blogRepo->findOneBy(array('id' => $id));

    其中 'id' 是实体中的现有字段。

    您可以在此处查看 Doctrine 的课程文档:EntityRepository

    编辑:看起来 findOneById 确实存在,只要实体有一个字段“Id”。 Check the docs。感谢 Ryall 指出这一点

    【讨论】:

    • 是的,$entity = $em->getRepository('VendorSomeBundle:Post')->findOneById($id) 也可以。但是您必须确保 Post 实体具有该属性。重要的是要记住存储库不等同于 symfony1 的 *Table 类。实体应该已经知道映射、关系和偏好。
    • findOneById 是一个有效的魔法方法,假设实体上有一个 id 字段。 docs.doctrine-project.org/en/2.0.x/reference/…
    【解决方案3】:

    试试这个

    $blogRepo = $this->getRepository('myproject.blog.repository.blog');  
    $blog = $blogRepo->findOneById($id);  
    

    getRepository

    【讨论】: