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.