带继承的 Doctrine ODM 双向参考
Doctrine ODM bi-direction reference with inheritance
我有这个问题:我有几个扩展了一些基础文档的文档。所有这些文档都有某种注释功能,这意味着用户可以向它们添加注释。因此,我有存储在单独集合中的注释文档(它需要可搜索且不能嵌入)并且拥有者 属性 引用了注释所属的文档。我无法用学说对此进行建模:
<?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。在其他情况下,我得到:找不到标识符为 "XXX" 的 "Proxies__CG__\Base" 文档。
它显然试图加载 Base class 而不是 MyDocument。如何强制它加载正确的class?我尝试将 Base 设置为 MappedSuperclass,设置鉴别器字段,省略 targetDocument 等。但没有任何效果像预期的那样以不同的 errors/wrong 行为结束。
这可能吗?
可能相关:
- Weird Doctrine ODM exception when using references together with inheritance
- https://github.com/doctrine/mongodb-odm/issues/442
注意:none 他们真的帮助了我,或者我错过了一些东西。
您缺少基本 class 的鉴别器定义:
/**
* @ODM\MappedSuperclass
* @ODM\InheritanceType("COLLECTION_PER_CLASS")
* @ODM\DiscriminatorField("type")
* @ODM\DiscriminatorMap({
* "document"=MyDocument::class
* })
*/
abstract class Base {
// ...
}
完成后,它应该会按预期工作。注意继承类型也可以是SINGLE_COLLECTION
,这取决于你是想将文档存放在同一个集合还是不同的集合中。
我有这个问题:我有几个扩展了一些基础文档的文档。所有这些文档都有某种注释功能,这意味着用户可以向它们添加注释。因此,我有存储在单独集合中的注释文档(它需要可搜索且不能嵌入)并且拥有者 属性 引用了注释所属的文档。我无法用学说对此进行建模:
<?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。在其他情况下,我得到:找不到标识符为 "XXX" 的 "Proxies__CG__\Base" 文档。
它显然试图加载 Base class 而不是 MyDocument。如何强制它加载正确的class?我尝试将 Base 设置为 MappedSuperclass,设置鉴别器字段,省略 targetDocument 等。但没有任何效果像预期的那样以不同的 errors/wrong 行为结束。
这可能吗?
可能相关:
- Weird Doctrine ODM exception when using references together with inheritance
- https://github.com/doctrine/mongodb-odm/issues/442
注意:none 他们真的帮助了我,或者我错过了一些东西。
您缺少基本 class 的鉴别器定义:
/**
* @ODM\MappedSuperclass
* @ODM\InheritanceType("COLLECTION_PER_CLASS")
* @ODM\DiscriminatorField("type")
* @ODM\DiscriminatorMap({
* "document"=MyDocument::class
* })
*/
abstract class Base {
// ...
}
完成后,它应该会按预期工作。注意继承类型也可以是SINGLE_COLLECTION
,这取决于你是想将文档存放在同一个集合还是不同的集合中。