1

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

基类,抽象类:

/**
* @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 返回的对象是类的代理。我以为是因为我将集合从 to 重命名,Application_Model_Image内部对象Application_Model_Entry引用($ref字段 of DBRef)仍然指向- 在我从数据库中删除第一个对象后,第二个对象变得很好。Application_Model_Image

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

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

4

1 回答 1

5

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

为后代:

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