简体   繁体   English

我无法在Symfony中从学说odm中检索嵌入式文档

[英]I can't retrieve embedded documents from doctrine odm in Symfony

I have a "Page" document with multiple "PageContent" embedded documents. 我有一个带有多个“ PageContent”嵌入式文档的“页面”文档。 When I recover a "Page" the property "contents" is empty. 当我恢复“页面”时,属性“内容”为空。 If I don't hydrate results data is there but when i hydrate them, they disappear. 如果我不添加结果数据,但是当我添加结果数据时,它们就会消失。

I read everything i found and i don't see i did anything different from every working example. 我阅读了发现的所有内容,但看不到我所做的每个工作示例都与众不同。

Please help me. 请帮我。 I'm going crazy with all this. 这一切我都疯了。

Page Document: 页面文档:

namespace AppBundle\Document;

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

/**
 * @MongoDB\Document(collection="pages")
 */
class Page
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\Field(type="string")
     */
    protected $name;

    /**
     * @MongoDB\Field(type="string")
     */
    protected $slug;

    /**
     * @MongoDB\EmbedMany(targetDocument="\AppBundle\Document\PageContent")
     */
    protected $contents = array();

    /**
     * @MongoDB\Field(type="date")
     */
    protected $createdAt;

    /**
     * @MongoDB\Field(type="date")
     */
    protected $updatedAt;

    /**
     * @MongoDB\Field(type="string")
     */
    protected $author;

    public function __toString()
    {
        return $this->getName();
    }

     /**
     * Get id
     *
     * @return id $id
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return $this
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }

    /**
     * Get name
     *
     * @return string $name
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set slug
     *
     * @param string $slug
     * @return $this
     */
    public function setSlug($slug)
    {
        $this->slug = $slug;
        return $this;
    }

    /**
     * Get slug
     *
     * @return string $slug
     */
    public function getSlug()
    {
        return $this->slug;
    }

    /**
     * Set createdAt
     *
     * @param date $createdAt
     * @return $this
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;
        return $this;
    }

    /**
     * Get createdAt
     *
     * @return date $createdAt
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Set updatedAt
     *
     * @param date $updatedAt
     * @return $this
     */
    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;
        return $this;
    }

    /**
     * Get updatedAt
     *
     * @return date $updatedAt
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * Set author
     *
     * @param string $author
     * @return $this
     */
    public function setAuthor($author)
    {
        $this->author = $author;
        return $this;
    }

    /**
     * Get author
     *
     * @return string $author
     */
    public function getAuthor()
    {
        return $this->author;
    }

    /**
     * Add content
     *
     * @param AppBundle\Document\PageContent $content
     */
    public function addContent(\AppBundle\Document\PageContent $content)
    {
        $this->contents[] = $content;
    }

    /**
     * Remove content
     *
     * @param AppBundle\Document\PageContent $content
     */
    public function removeContent(\AppBundle\Document\PageContent $content)
    {
        $this->contents->removeElement($content);
    }

    /**
     * Get contents
     *
     * @return \Doctrine\Common\Collections\Collection $contents
     */
    public function getContents()
    {
        return $this->contents;
    }
}

Page Content Document: 页面内容文档:

<?php

namespace AppBundle\Document;

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

/**
 * @MongoDB\EmbeddedDocument
 */
class PageContent
{
    /**
     * @MongoDB\Field(type="string")
     */
    protected $type;

    /**
     * @MongoDB\Field(type="string")
     */
    protected $content;

    /**
     * Set type
     *
     * @param string $type
     * @return $this
     */
    public function setType($type)
    {
        $this->type = $type;
        return $this;
    }

    /**
     * Get type
     *
     * @return string $type
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Set content
     *
     * @param string $content
     * @return $this
     */
    public function setContent($content)
    {
        $this->content = $content;
        return $this;
    }

    /**
     * Get content
     *
     * @return string $content
     */
    public function getContent()
    {
        return $this->content;
    }
}

In a Controller: 在控制器中:

 $dm = $this->get('doctrine_mongodb')->getManager();
            $document = $dm->createQueryBuilder('AppBundle:Page')
                ->field('id')->equals('someid')
                ->hydrate(false)
                ->getQuery()
                ->getSingleResult();

This returns data correctly: 这将正确返回数据:

array:7 [▼
  "_id" => MongoId {#439 ▶}
  "name" => "contenido 3"
  "slug" => "contenido-3"
  "contents" => array:1 [▼
    0 => array:2 [▼
      "type" => "html"
      "content" => "some content"
    ]
  ]
  "createdAt" => MongoDate {#440 ▶}
  "updatedAt" => MongoDate {#441 ▶}
  "author" => "adminpassb"
]

But this doesn't: 但这不是:

$dm = $this->get('doctrine_mongodb')->getManager();
        $document = $dm->createQueryBuilder('AppBundle:Page')
            ->field('id')->equals('someid')
            ->hydrate(true)
            ->getQuery()
            ->getSingleResult();

Page {#424 ▼
  #id: "57d7cdb15d6361ef0c3c986a"
  #name: "contenido 3"
  #slug: "contenido-3"
  #contents: []
  #createdAt: DateTime {#428 ▶}
  #updatedAt: DateTime {#430 ▶}
  #author: "adminpassb"
}

All embedMany mappings are retrieved as persistent collections which are loaded lazily. 检索所有embedMany映射作为延迟加载的持久性集合。 Depending on how you generated the output above, this would explain why you think it's empty. 根据您生成上述输出的方式,这将解释您为何认为其为空的原因。 Running count or toArray on the collection should return the correct number of items. 在集合上运行counttoArray应该返回正确的项目数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM