php 类XXX不是有效的文档或Map的超类

rekjcdws  于 2022-12-17  发布在  PHP
关注(0)|答案(4)|浏览(102)

我正在使用doctrine Doctrine MongoDB ODM 1.0.3。当尝试使用doctrine更新文档时,我收到以下错误:
类XXX不是有效的文档或Map的超类。
我为文档创建了以下类:

<?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();

但得到上述误差。

wbgh16ku

wbgh16ku1#

正如您在自己的答案中所述,您需要提供类的完全限定名。只是想补充一下,与传递字符串相比,使用静态类属性更好,如下所示:createQueryBuilder(\Documents\Posts::class);它与IDE(自动完成、重构等)配合使用效果更好。

z31licg0

z31licg02#

如果在PHP 8或更高版本中遇到此错误,请检查您没有混合注解(例如/** @Entity */)和属性(例如#[Entity]),并且您已经在config中指明了使用的方法:

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

当我开始一个新项目时,这总是让我犯错误,当我习惯于使用属性时,配置默认为注解。

imzjd6km

imzjd6km3#

如果其他人有类似的问题,您需要将完全限定的类名传递给createQueryBuilder。我的文档类都在Documents名称空间中,因此像createQueryBuilder('\Documents\Posts')这样传递后,问题就解决了。

vngu2lb8

vngu2lb84#

根据这里其他不同的答案,似乎这个错误不是非常精确。
在我的例子中,类缺少EmbeddedDocument注解。

namespace Foo;

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

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

相关问题