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

Php Doctrine ODM返回基类的代理对象,而不是子类文档,php,mongodb,doctrine,doctrine-odm,odm,Php,Mongodb,Doctrine,Doctrine Odm,Odm,在为我的项目提供新功能的工作中,我决定扩展模型。我决定使用基类,对常用方法进行分组,使用很少的子类,所有子类都保存在一个集合中 基本抽象类: /** * @MongoDB\Document(repositoryClass="EntryRepository") * @MongoDB\MappedSuperclass * @MongoDB\InheritanceType("SINGLE_COLLECTION") * @MongoDB\DiscriminatorField(fieldName="typ

在为我的项目提供新功能的工作中,我决定扩展模型。我决定使用基类,对常用方法进行分组,使用很少的子类,所有子类都保存在一个集合中

基本抽象类:

/**
* @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返回的对象是基类的代理。我认为这是因为我将集合从Application\u Model\u Image重命名为Application\u Model\u条目,DBRef的内部对象引用$ref字段仍然指向Application\u Model\u Image,但我注意到了一些有趣的事情:总是第一个查询结果是一个具体类的正确文档,其余的都是基类代理——在我从数据库中删除第一个对象之后,第二个对象就变好了

在显示页面的单个对象上,对于所有对象,一切都正常工作,所以我认为可能是Zend Framework的pager类对结果进行了迭代,所以我跳过了pager,直接从查询中转储了对象。我打印了100个第一个结果,其中一些有合适的课程。我查看了数据库,但我没有注意到数据与数据库的任何特殊之处。我想可能是引用有问题,但正如我在上面所写的,如果同一个对象在结果列表中是第一个,那么它就可以工作


有什么想法或提示吗?我可以进行更多的调试,但我需要被告知在哪里可以查看Doctrine的代码。

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

为子孙后代:

文档注释用于具体类 MappedSuperclass注释用于抽象类 如果您在查询结果中接收到代理类对象,则该部门可能存在混乱 即使没有文档注释,也可以指示鉴别器字段/值。
根据上面jmikola的评论,我已经删除了文档注释,一切都开始顺利进行。奇怪的结果让我在错误的地方寻找错误,但谢天谢地,我在这里得到了一个提示

为子孙后代:

文档注释用于具体类 MappedSuperclass注释用于抽象类 如果您在查询结果中接收到代理类对象,则该部门可能存在混乱 即使没有文档注释,也可以指示鉴别器字段/值。
文档注释不应与MappedSuperclass结合使用。前者用于具体实现,后者用于抽象类。除了第一个是代理对象之外,我不理解查询结果,因为代理只能在引用一个/多个关系的上下文中创建为占位符。查询结果就像我在第一个pastebin链接中显示的一样-第一个是一个具体的类,其余大部分都是Proxy项目Proxy\uuuu CG\uuuuuu\Application\u Model\u条目。删除文档注释后,一切都正常,非常感谢。目前情况并非如此,但如果我愿意,我仍然可以为整个继承树指明集合名称吗?我认为MappedSuperclass不支持任何选项,因此您必须进行实验。根据单个集合继承映射,所有继承类仍应存储在同一集合中,但名称本身可能最终派生自抽象类的名称。不幸的是,您是对的。在重构之前,我有一个自定义的存储库类,我希望仍然能够使用它,但由于MappedSuperclass不接受任何参数,所以这是不可能的。我看到你提出了一个允许继承的变更,但后来你放弃了。我的基本原理是,虽然我可以为所有最终类指明repository类,但在调用getRepository时,我无法获得表示整个继承树的repository对象,我必须提供一个类,而且我不能使用基类,仅定义了repoclass的具体类。文档注释不应与MappedSuperclass结合使用。前者用于具体实现,后者用于抽象类。除了第一个是代理对象之外,我不理解查询结果,因为代理只能在引用一个/多个关系的上下文中创建为占位符。查询结果就像我在第一个pastebin链接中显示的一样-第一个是一个具体的类,其余大部分都是Proxy项目Proxy\uuuu CG\uuuuuu\Application\u Model\u条目。删除文档注释后,一切都正常,非常感谢。目前情况并非如此,但如果我愿意,我还可以指出
整个继承树的集合名称?我认为MappedSuperclass不支持任何选项,所以您必须进行实验。根据单个集合继承映射,所有继承类仍应存储在同一集合中,但名称本身可能最终派生自抽象类的名称。不幸的是,您是对的。在重构之前,我有一个自定义的存储库类,我希望仍然能够使用它,但由于MappedSuperclass不接受任何参数,所以这是不可能的。我看到你提出了一个允许继承的变更,但后来你放弃了。我的基本原理是,虽然我可以为所有最终类指明repository类,但在调用getRepository时,我无法获得表示整个继承树的repository对象,我必须提供一个类,而且我不能使用基类,只能使用定义了repository类的具体类。