2012-06-04 4 views
2

Disons que j'ai deux Documents simples comme celui-ci, où une personne peut avoir beaucoup de papiers, mais un papier ne peut appartenir qu'à une seule personne.ODM: Références non créées sur les deux documents

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); 
} 
} 

Je pensais que je l'ai lu quelque part lorsque vous créez une référence à une extrémité, Doctrine ODM va créer automatiquement les références des deux côtés pour vous. Donc, si j'exécute la déclaration ci-dessous, je verrai une référence à la personne à partir d'un document papier, ainsi que des références à papier (s) dans un document personne.

//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(); 

Lorsque je fais cela, et vérifiez le mongodb, la référence du papier -> personne est là. Mais je ne vois pas de personne de référence -> papier montré dans le DB. Je pensais que les annotations en cascade aidaient à ça, mais il me manque évidemment quelque chose.

Comment puis-je m'assurer que la référence est contenue aux deux extrémités, afin que je puisse exécuter des requêtes pour voir tous les papiers qui appartiennent à une seule personne? Est-ce que cela doit être fait manuellement, ou est-ce que je peux avoir une doctrine pour gérer cela pour moi?

MISE À JOUR

Le premier paragraphe de cette page m'a fait penser qu'il était possible.

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

Répondre

1

se trouve que je aurais dû lire cette page entière. Si j'utilise mappedBy & inversedBy, et persiste toujours le document qui a inversedBy dans son Annotation, alors j'obtiens cette relation bidirectionnelle

/** @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); 
Questions connexes