我有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。
我认为必须有错误类型的继承结构(?)但是我不清楚我可以采取哪些替代方法?感谢您的帮助或指导:)
答案 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。