带有继承的Doctrine ODM双向引用

时间:2017-02-10 16:53:57

标签: php inheritance doctrine-orm doctrine-odm bidirectional

我有这个问题:我有几个文档扩展了一些基础文档。所有这些文档都有一些注释功能,这意味着用户可以为它们添加注释。因此,我有一个Note文档存储在单独的集合中(它需要是可搜索的,不能嵌入),并拥有引用该笔记所属文档的所有者属性。我很难用学说来建模:

<?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。在其他情况下,我得到了:&#34; Proxies__CG __ \ Base&#34;带有标识符的文档&#34; XXX&#34;无法找到。

显然它试图加载Base类而不是MyDocument。如何强制它加载正确的类?我尝试将Base设置为MappedSuperclass,设置discriminator字段,省略targetDocument等。没有任何工作按预期工作,并以不同的错误/错误行为结束。

这甚至可能吗?

可能相关:

注意:他们都没有帮助,或者我错过了什么。

1 个答案:

答案 0 :(得分:2)

你错过了基类的鉴别器定义:

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

一旦你有了它,它应该按预期工作。请注意,继承类型也可以是SINGLE_COLLECTION,具体取决于您是要将文档存储在相同或不同的集合中。