类XXX不是一个有效的文档或映射超类。

4
我将使用 doctrine Doctrine MongoDB ODM 1.0.3 进行翻译。在尝试使用 doctrine 更新文档时,我遇到了以下错误:

类 XXX 不是有效的文档或映射超级类。

我有以下文档类:

<?php
namespace Documents;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
* @ODM\Document(collection="posts")
*/
class Posts
{
    /** @ODM\Id */
    private $id;

    /** @ODM\Field(type="string") */
    private $title;

    /** @ODM\EmbedMany(targetDocument="Comment") */
    private $comments = array();

    public function setTitle($title)
    {
        $this->title = $title;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function addComment($comment)
    {
        $this->comments[] = $comment;
    }

    public function getComments()
    {
        return $this->comments;
    }
}

以下代码用于添加新文档:
$post = new \Documents\Posts();
$post->setTitle( $_POST['title'] );
$dm->persist($post);
$dm->flush();

之后我想更新已添加的文档以添加新的评论,例如。 我使用以下代码:

$comment = new \Documents\Comment($_POST['comment_text']);
$dm->createQueryBuilder('Posts')
    ->update()
    ->field('comments')->push($comment)
    ->field('_id')->equals(new \MongoId($_POST['id']))
    ->getQuery()
    ->execute();

但是遇到了上述错误。
4个回答

2

对于在PHP 8及以上版本中遇到此错误的人,请检查您是否混合使用注释(例如/** @Entity */)和属性(例如#[Entity]),并且您已经在配置中指示了您正在使用哪种方法:

mappings:
    App:
        # pick one:
        type: annotation
        type: attribute

每当我开始一个新项目时,配置默认为注释而不是属性,这总是让我感到困惑。


1

如您在自己的答案中所述,您需要提供完全限定类名。只是想补充一点,最好不要传递字符串,而是使用静态类属性,像这样:createQueryBuilder(\Documents\Posts::class); 它可以更好地与IDE(自动完成、重构等)配合使用。


0
如果有其他人遇到了类似的问题,你需要将完全限定的类名传递给createQueryBuilder。我的文档类都在Documents命名空间中,所以将其传递为createQueryBuilder('\Documents\Posts')后,问题得到解决。

0

根据其他不同的答案,似乎这个错误并不是非常精确。

在我的情况下,类缺少了EmbeddedDocument注释。

namespace Foo;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
 * @ODM\EmbeddedDocument
 */
class Bar { }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接