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 из документа Paper, А ТАКЖЕ ссылки на Paper (s) в документе Person.

//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, там есть ссылка с бумаги -> человек. Но я не вижу ссылочного лица -> документ, указанный в db. Я думал, что каскадные аннотации помогли с этим, но, очевидно, что-то мне не хватает.

Как я могу обеспечить наличие ссылки на обоих концах, чтобы я мог запускать запросы, чтобы увидеть все документы, принадлежащие одному человеку? Нужно ли это делать вручную, или я могу попросить доктрину справиться с этим за меня?

ОБНОВЛЕНИЕ

Первый абзац на этой странице заставил меня подумать, что это возможно.

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


person Nathan    schedule 04.06.2012    source источник


Ответы (1)


Оказывается, мне следовало прочитать всю эту страницу. Если я использую mappedBy и conversedBy и всегда сохраняю документ, который имеет инверсию в аннотации, то я получаю двунаправленную связь.

/** @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);
person Nathan    schedule 06.06.2012