lea*_*ode 1 php doctrine mongodb odm doctrine-odm
在我为项目提供新功能的过程中,我决定扩展模型.我决定使用基类,将常用方法分组,只有很少的子类,所有子类都保存在一个集合中.
基础,抽象类:
/**
* @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();
}
Run Code Online (Sandbox Code Playgroud)
一些具体的类(我有更多,类似,但有些是抽象的):
<?php
/** @MongoDB\Document */
class Application_Model_Image extends Application_Model_Entry
{
function foo()
{
return 'foo';
}
}
Run Code Online (Sandbox Code Playgroud)
在转换之后,我打开了我的索引页面,并且出现了错误 - PHP试图调用抽象方法,因为Doctrine返回的对象是基类的代理.我想这是因为我从改名为收集Application_Model_Image到Application_Model_Entry和内部对象引用($ref领域DBRef)仍然指向Application_Model_Image,但我注意到一些有趣的:总是第一个查询结果的具体类的适当的文件,其余的都是基类代理 - 从数据库中删除第一个对象后,第二个对象变好了.
在单个对象显示页面上,对于所有对象,一切正常,所以我想也许是Zend Framework的寻呼机类迭代结果,所以我跳过了寻呼机并直接从查询中转储了对象.我打印出100个第一个结果的类,其中一些有适当的类(在pastebin上的那个列表的片段).我查看了数据库,但我注意到数据没什么特别的(工作与不工作).我想也许引用可能有问题,但正如我上面所写,如果它首先出现在结果列表中,那么同一个对象可能会起作用.
任何想法或提示?我可以调试更多,但我需要被告知在哪里查看Doctrine的代码.
根据上面jmikola的评论,我删除了Document注释,一切都开始顺利进行.奇怪的结果我让我在错误的地方寻找错误,但谢天谢地我在这里得到了一个提示.
后人:
Document 注释适用于具体类MappedSuperclass 注释用于抽象类Document注释,您也可以指示鉴别器字段/值.| 归档时间: |
|
| 查看次数: |
1184 次 |
| 最近记录: |