Symfony2的Doctrine类表继承

时间:2013-05-15 10:05:05

标签: symfony doctrine-orm class-table-inheritance

我有2个Symfony捆绑包。将始终安装AdminBundle。可以安装或不安装PageBundle。

我想定义一个名为AdminModule的基本实体(名称,控制器类,描述,已启用),还有一个简单地继承自AdminModule的PageModule(实体控制器将实现特定的接口)。

<?php

namespace AdminBundle\Entity;

/**
 * Admin Component
 *
 * @ORM\Entity
 * @ORM\Table(name="admin_module")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"page" = "\PageBundle\Entity\PageComponent"})
 */
class AdminModule
{
    // private vars, getters, setters
}
?>

<?php
namespace PageBundle\Entity;

use AdminBundle\Entity\AdminModule;

/**
 * Page Component
 *
 * @ORM\Entity
 * @ORM\Table(name="page_module")
 */
class PageModule extends AdminModule
{
    //
}
?>

我认为,我遇到的问题是AdminModule注释@ORM\DiscriminatorMap({"page" = "\PageBundle\Entity\PageModule"})需要在AdminBundle上定义 - 但可能没有安装PageBundle。

我认为必须有错误类型的继承结构(?)但是我不清楚我可以采取哪些替代方法?感谢您的帮助或指导:)

1 个答案:

答案 0 :(得分:0)

你不能用表继承映射做你正在尝试的事情, 因为你必须在父类中写注释,所以父类本身最终会与他的孩子结合。

您可以使用的是映射的超类(@MappedSuperclass)来扩展实际的父实体。

然后,所有公共属性应该进入映射的超类,使用其子级作为实际实体来定义不同的继承映射和关联(映射的超类中的关联映射非常有限)。

所以在你的具体情况下你可以有这样的结构:

/** 
 * I'm not an actual Entity!
 *
 * @MappedSuperClass */
Class ModuleSuperClass {}


/** 
 * I don't have children
 * 
 * @ORM\Entity */
Class BaseModule extends ModuleSuperClass {}

/** 
 * I have children
 * 
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"page" = "Page"}) 
 */
Class AdminModule extends ModuleSuperClass {}

/**
 * I'm just a child
 *
 * @ORM\Entity
 */
Class PageModule extends AdminModule {}

你的里程当然可能会有所不同,即我宁愿拥有一个没有子节点的BaseModule类,然后是一个完全不同的命名空间中的BaseModule来扩展AdminModule和PageModule。