繁体   English   中英

具有继承性的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”文档。

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

这有可能吗?

可能相关:

注意:他们没有一个真正帮助过我,或者我错过了一些事情。

您缺少基类的鉴别符定义:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM