ODM: Невозможно достичь двунаправленных отношений
У меня есть два документа. Я пытаюсь найти все документы, которые связаны с конкретным человеком. Документы сохраняются в своих коллекциях, и создается ссылка из Person
в Paper
, но не наоборот.
/** @ODM\Document */
class Paper
{
/**
* @ODM\Id
*/
protected $id;
/** @ODM\ReferenceOne(targetDocument="Person", cascade={"all"}, mappedBy="papers") */
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);
}
}
/** @ODM\Document */
class Person
{
/**
* @ODM\Id
*/
protected $id;
/** @ODM\ReferenceMany(targetDocument="Paper", cascade={"all"}, inversedBy="person") */
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);
}
}
СОЗДАТЬ НОВУЮ ДВУСТОРОННУЮ ССЫЛКУ
$person = $dm->getRespository('Person')->find($person_id);
$paper = new Paper();
$person->papers->add($paper);
$dm->persist($person);
$dm->flush();
Далее в коде этот запрос возвращает 0 результатов; не должны ли они возвращать документы, написанные указанным лицом?
$papers = $dm->createQueryBuilder('Paper')
->field('person.$id')->equals(new \MongoId($person_id_as_string))
->getQuery()->execute();
1 ответ
Решение
Если Paper:: person помечается как "mappedBy", это означает, что Paper не является "владельцем", и доктрина не сохранит никаких изменений в Paper:: person.
Чтобы ваш запрос работал, сделайте "Бумагу" владельцем, чтобы "Бумага" сохранила ссылку на "Персонал".
/** @ODM\Document */
class Person
{
/** @ODM\ReferenceMany(targetDocument="Paper", mappedBy="person") */
protected $papers;
}
/** @ODM\Document */
class Paper
{
/** @ODM\ReferenceOne(targetDocument="Person", inversedBy="papers") */
protected $person;
}
Создание бумаги и сохранение ссылки на человека:
$person = $dm->getRespository('Person')->find($person_id);
$paper = new Paper();
$paper->person = $person;
$dm->persist($paper);
$dm->flush();
Запрос документов от $person:
$papers = $dm->createQueryBuilder('Paper')
->field('person')->references($person)
->getQuery()->execute();