ODM:未在两个文档上创建引用

时间:2012-06-04 17:52:23

标签: doctrine doctrine-orm doctrine-odm

假设我有两个这样的简单文件,一个人可以有很多论文,但一篇论文只能属于一个人。

namespace Dashboard\Document;

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

/** @ODM\Document(db="testing", collection="person")
 * @ODM\InheritanceType("COLLECTION_PER_CLASS")
 */
class Person
{
/**
 * @ODM\Id
 */
protected $id;

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

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

/** @ODM\ReferenceMany(targetDocument="Paper", cascade={"all"}) */
protected $papers;


public function __get($property) {
    return $this->$property;
}

public function __set($property, $value) {
    $this->$property = $value;
}

public function toArray() {
    return get_object_vars($this);
}
}
namespace Dashboard\Document;

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

/** @ODM\Document(db="testing", collection="paper")
 * @ODM\InheritanceType("COLLECTION_PER_CLASS")
 */
class Paper
{
/**
 * @ODM\Id
 */
protected $id;

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

/** @ODM\ReferenceOne(targetDocument="Person", cascade={"all"}) */
protected $person;


public function __get($property) {
    return $this->$property;
}

public function __set($property, $value) {
    $this->$property = $value;
}

public function toArray() {
    return get_object_vars($this);
}
}

当我在一端创建引用时,我以为我读到了某个地方,Doctrine ODM将为您自动创建双方的引用。因此,如果我执行下面的陈述,我将在纸质文档中看到对Person的引用,以及对Person文档中的Paper的引用。

//For demo sake; $person already contains a Person document
try {
    $paper = $dm->getRepository('\Dashboard\Document\Paper')
            ->find($paperId);
} catch (\Doctrine\ODM\MongoDB\MongoDBException $e) {
    $this->setStatusFailure($e->getMessage());
    $this->sendResponse();
}    

$paper->person = $person;
$dm->persist($paper);
$dm->flush();

当我这样做,并检查mongodb时,来自纸张的参考 - >人就在那里。但我看不到参考人 - >数据库中显示的文件。我认为级联注释有助于此,但显然我错过了一些东西。

如何确保引用包含在两端,以便我可以运行查询以查看属于一个人的所有论文?这是否必须手动完成,或者我可以为我处理这个问题吗?

更新

本页的第一段让我觉得有可能。

http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/bidirectional-references.html

1 个答案:

答案 0 :(得分:1)

原来我应该读完整页。如果我使用mappedBy& inversedBy,并始终保持反转的文档在其注释中,然后我得到双向关系

/** @ODM\ReferenceOne(targetDocument="Person", cascade={"all"}, inversedBy="papers") */
protected $person;

//Will give me a relationship I can query on both sides
$person->papers->add($paper);