小编lea*_*ode的帖子

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的代码.

php doctrine mongodb odm doctrine-odm

1
推荐指数
1
解决办法
1184
查看次数

标签 统计

doctrine ×1

doctrine-odm ×1

mongodb ×1

odm ×1

php ×1