У меня есть эта проблема: у меня есть несколько документов, которые расширяют базовый документ. Все эти документы имеют функцию заметок, что означает, что пользователи могут добавлять заметки к ним. Таким образом, у меня есть документ Note, который хранится в отдельной коллекции (он должен быть доступен для поиска и не может быть внедрен), и у меня есть свойство owner, которое ссылается на документ, к которому принадлежит заметка. У меня есть проблемы с моделированием этого с доктриной:
<?php
/** @ODM\MappedSuperclass */
abstract class Base {
/** @ODM\Id */
public $id;
/** @ODM\ReferenceMany(targetDocument="Note", mappedBy="owner") */
public $notes;
}/** @ODM\Document */
class MyDocument extends Base {
/** @ODM\String */
public $name;
}/** @ODM\Document */
class Note {
/** @ODM\Id */
public $id;
/** @ODM\ReferenceOne(targetDocument="Base", inversedBy="notes") */
public $owner;
/** @ODM\String */
public $text;
}
$mdoc = new MyDocument;
$note = new Note;
$mdoc->name = 'foo';
$note->text = 'bar';
$mdoc->notes[] = $note;
$note->owner = $mdoc;
$dm->persist($mdoc);
$dm->persist($note);
$dm->flush();
$dm->clear();
$note2 = $dm->find(Note::class, $note->id);
echo $note2->owner->name;
И я получаю: Примечание: неопределенное свойство: Proxies__CG __ \ Base :: $ name. В других случаях я получил: не удалось найти документ «Proxies__CG __ \ Base» с идентификатором «XXX».
Очевидно, он пытается загрузить базовый класс вместо MyDocument. Как заставить его загрузить правильный класс? Я попытался установить Base как MappedSuperclass, установить поле дискриминатора, пропустить targetDocument и т. Д. И ничего не работает, как ожидалось, и заканчивается различными ошибками / неправильным поведением.
Это вообще возможно?
Возможно связано:
Примечание: никто из них не помог, или я что-то пропустил.
Вам не хватает определения дискриминатора для базового класса:
/**
* @ODM\MappedSuperclass
* @ODM\InheritanceType("COLLECTION_PER_CLASS")
* @ODM\DiscriminatorField("type")
* @ODM\DiscriminatorMap({
* "document"=MyDocument::class
* })
*/
abstract class Base {
// ...
}
Если у вас есть это, оно должно работать как положено. Обратите внимание, что тип наследования также может быть SINGLE_COLLECTION
в зависимости от того, хотите ли вы хранить документы в одной или разных коллекциях.
Других решений пока нет …