Doctrine ODM返回基类的代理对象而不是子类文档

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_ImageApplication_Model_Entry和内部对象引用($ref领域DBRef)仍然指向Application_Model_Image,但我注意到一些有趣的:总是第一个查询结果的具体类的适当的文件,其余的都是基类代理 - 从数据库中删除第一个对象后,第二个对象变好了.

在单个对象显示页面上,对于所有对象,一切正常,所以我想也许是Zend Framework的寻呼机类迭代结果,所以我跳过了寻呼机并直接从查询中转储了对象.我打印出100个第一个结果的类,其中一些有适当的类(在pastebin上的那个列表的片段).我查看了数据库,但我注意到数据没什么特别的(工作不工作).我想也许引用可能有问题,但正如我上面所写,如果它首先出现在结果列表中,那么同一个对象可能会起作用.

任何想法或提示?我可以调试更多,但我需要被告知在哪里查看Doctrine的代码.

lea*_*ode 5

根据上面jmikola的评论,我删除了Document注释,一切都开始顺利进行.奇怪的结果我让我在错误的地方寻找错误,但谢天谢地我在这里得到了一个提示.

后人:

  • Document 注释适用于具体类
  • MappedSuperclass 注释用于抽象类
  • 如果在查询结果中收到代理类对象,则可能在该部门中有混合
  • 即使没有Document注释,您也可以指示鉴别器字段/值.