Doctrine 2 MongoDB获取对象的子记录

时间:2012-03-20 16:52:44

标签: mongodb symfony doctrine-orm doctrine-odm

我正在使用doctrine / mongodb-odm-bundle而且我有一个问题:我无法从文档中获取引用行(或者我只是不知道如何执行此操作..) 我有2个文档,一对多参考如下: 第一

/**
 * @MongoDB\Document(collection="categories")
 */
class Category
{
    /**
     * @var integer $id
     *
     * @MongoDB\Id(strategy="auto")
     */
    private $id;

    /**
     * @var string $name
     *
     * @MongoDB\String
     * @Assert\NotBlank()
     * @Assert\MinLength(3)
     */
    private $name;

    /**
     * @MongoDB\ReferenceMany(targetDocument="Application\Bundle\DefaultBundle\Document\Wallpaper", mappedBy="category")
     */
    private $files;
.................
    /**
     * Set files
     *
     * @param array $files
     */
    public function setFiles($files)
    {
        $this->files = $files;
    }

    /**
     * Get files
     *
     * @return array $files
     */
    public function getFiles()
    {
        return $this->files;
    }

.................
第二

/**
 * @MongoDB\Document(collection="wallpapers")
 */
class Wallpaper
{
    /**
     * @var string $id
     * @MongoDB\Id(strategy="auto")
     */
    protected $id;
    /**
     * @MongoDB\ReferenceOne(targetDocument="Application\Bundle\DefaultBundle\Document\Category", inversedBy="files")
     */
    private $category;

    /**
     * Get category
     *
     * @return Application\Bundle\DefaultBundle\Document\Category $category
     */
    public function getCategory()
    {
        return $this->category;
    }

    /**
     * Set category
     *
     * @param Application\Bundle\DefaultBundle\Document\Category $category
     */
    public function setCategory($category)
    {
        $this->category = $category;
    }

}

这是来自控制器的代码:

$category = $dm->getRepository('ApplicationDefaultBundle:Category')->findOneBy(...);
$wallpapers = $category->getFiles();

$ wallpapers和$ document->文件为NULL。我怎样才能检索与类别相关的记录?如何从具体壁纸对象中获取类别?是否有像标准ORM那样的“JOIN”模拟?

3 个答案:

答案 0 :(得分:2)

映射看起来正确。我认为您的问题可能与查询有关。我还要检查壁纸集合是否有正确的文档,其中的类别字段填充了正确的DBRef对象数据。

$category = $dm->getRepository('Application\Bundle\DefaultBundle\Document\Wallpaper')->findOneById($id);
$wallpapers = $category->getFiles(); // Will return a cursor to the wallpaper objects
foreach ($wallpapers as $wallpaper) {
     do stuff
}

如果这不是问题,可以粘贴您正在尝试的完整查询以及来自两个集合的数据样本。

答案 1 :(得分:2)

你确定DoctrineORM删除了你的项目吗?我有这个问题。我删除了我的项目DoctrineORM,它已经完成了。

答案 2 :(得分:0)

在SQL中没有“join”,ODM将进行单独的查询并将它们组合到对象中。默认情况下,doctrine在访问该部分时会懒得这样做。

正如Jamie所说,查询和数据是帮助这里的关键部分。