假设我有两个像这样的简单文档,一个人可以有很多篇论文,但一篇论文只能属于一个人。
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 会自动为您创建两侧的参考。因此,如果我执行下面的语句,我将看到来自 Paper 文档的对 Person 的引用,以及对 Person 文档中对 Paper(s) 的引用。
//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时,纸上的参考-->人就在那里。但我没有看到参考人--> 数据库中显示的论文。我认为级联注释对此有所帮助,但显然我遗漏了一些东西。
如何确保引用包含在两端,以便我可以运行查询以查看属于一个人的所有论文?这是否必须手动完成,或者我可以让教义为我处理这个?
更新
这一页的第一段让我觉得这是可能的。