Доктрина ODM двунаправленная ссылка с наследованием

У меня есть эта проблема: у меня есть несколько документов, которые расширяют базовый документ. Все эти документы имеют функцию заметок, что означает, что пользователи могут добавлять заметки к ним. Таким образом, у меня есть документ 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 и т. Д. И ничего не работает, как ожидалось, и заканчивается различными ошибками / неправильным поведением.

Это вообще возможно?

Возможно связано:

Примечание: никто из них не помог, или я что-то пропустил.

1

Решение

Вам не хватает определения дискриминатора для базового класса:

/**
* @ODM\MappedSuperclass
* @ODM\InheritanceType("COLLECTION_PER_CLASS")
* @ODM\DiscriminatorField("type")
* @ODM\DiscriminatorMap({
*     "document"=MyDocument::class
* })
*/
abstract class Base {
// ...
}

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector