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

时间:2013-02-24 21:38:58

标签: php mongodb doctrine doctrine-odm 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();
}

一些具体的类(我有更多,类似,但有些是抽象的):

<?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的代码。

1 个答案:

答案 0 :(得分:5)

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

后人:

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