我遇到了这个问题:我有几个文档扩展了一些基本文档。所有这些文档都具有某种注释功能,这意味着用户可以向其中添加注释。因此,我有存储在单独集合中的Note文档(它需要可搜索且不能嵌入),并且有引用该Note所属文档的所有者属性。我很难用条令建模:
<?php
/** @ODMMappedSuperclass */
abstract class Base {
/** @ODMId */
public $id;
/** @ODMReferenceMany(targetDocument="Note", mappedBy="owner") */
public $notes;
}
/** @ODMDocument */
class MyDocument extends Base {
/** @ODMString */
public $name;
}
/** @ODMDocument */
class Note {
/** @ODMId */
public $id;
/** @ODMReferenceOne(targetDocument="Base", inversedBy="notes") */
public $owner;
/** @ODMString */
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。在其他情况下,我得到:无法找到标识符为"XXX"的"Proxies__CG__\Base"文档。
它显然试图加载基类而不是MyDocument。如何强制它加载正确的类?我尝试将Base设置为MappedSuperclass,设置discriminator字段,省略targetDocument等。但没有什么能像预期的那样工作,并以不同的错误/错误行为结束。
这可能吗?
可能相关:
- 将引用与继承一起使用时的怪异原则ODM异常
- https://github.com/doctrine/mongodb-odm/issues/442
注意:他们中没有一个真的有帮助,或者我错过了一些东西。
您缺少基类的鉴别器定义:
/**
* @ODMMappedSuperclass
* @ODMInheritanceType("COLLECTION_PER_CLASS")
* @ODMDiscriminatorField("type")
* @ODMDiscriminatorMap({
* "document"=MyDocument::class
* })
*/
abstract class Base {
// ...
}
一旦你有了它,它应该会像预期的那样工作。请注意,继承类型也可以是SINGLE_COLLECTION
,这取决于您是将文档存储在同一个集合中还是存储在不同的集合中。