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

时间:2016-02-03 21:15:10

标签: php mongodb doctrine doctrine-odm

我正在使用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();

但得到上述错误。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

正如您在答案中所述,您需要提供完全合格的课程名称。只是想添加它比传递字符串更好,而不是像这样使用静态类属性:createQueryBuilder(\Documents\Posts::class);它在IDE中运行得更好(自动完成,重构等......)