在我为项目提供新功能的过程中,我决定扩展模型。我决定使用基类,将常用方法分组,只有很少的子类,所有子类都保存在一个集合中。
基础,抽象类:
/**
* @MongoDB\Document(repositoryClass="EntryRepository")
* @MongoDB\MappedSuperclass
* @MongoDB\InheritanceType("SINGLE_COLLECTION")
* @MongoDB\DiscriminatorField(fieldName="type")
* @MongoDB\DiscriminatorMap({"entry"="Application_Model_Entry", "image"="Application_Model_Image", "movie"="Application_Model_Movie"})
*/
abstract class Application_Model_Entry
{
abstract function foo();
}
一些具体的类(我有更多,类似,但有些是抽象的):
<?php
/** @MongoDB\Document */
class Application_Model_Image extends Application_Model_Entry
{
function foo()
{
return 'foo';
}
}
在转换之后,我打开了索引页面,并且出现了错误 - PHP试图调用抽象方法,因为Doctrine返回的对象是 base 类的代理。我认为这是因为我将集合从Application_Model_Image
重命名为Application_Model_Entry
,而内部对象引用($ref
的{{1}}字段)仍然指向DBRef
,但是我注意到一些有趣的事情:总是第一个查询结果是一个具体类的正确文档,其余的是基类代理 - 在我从数据库中删除第一个对象后,第二个变得很好。 / p>
在单个对象显示页面上,对于所有对象,一切正常,所以我想也许是Zend Framework的寻呼机类迭代结果,所以我跳过了寻呼机并直接从查询中转储了对象。我打印出100个第一批结果的类,其中一些有适当的类(Snippet of that list on pastebin)。我查看了数据库,但我发现数据没有什么特别之处(working vs not working)。我想也许引用可能有问题,但正如我上面所写的那样,如果它首先出现在结果列表中,那么同一个对象可能会起作用。
任何想法或提示?我可以调试更多,但我需要被告知在哪里查看Doctrine的代码。
答案 0 :(得分:5)
根据jmikola的评论,我删除了Document
注释,一切都开始顺利进行。奇怪的结果让我在错误的地方寻找错误,但幸好我在这里得到了一个提示。
后人:
Document
注释适用于具体类MappedSuperclass
注释适用于抽象类Document
注释,您也可以指示鉴别器字段/值。