【问题标题】:Doctrine Class Table Inheritance with Symfony2使用 Symfony2 的 Doctrine 类表继承
【发布时间】:2013-05-15 10:05:05
【问题描述】:

我有 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。

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

【问题讨论】:

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


    【解决方案1】:

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

    您可以使用映射的超类 (@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。

    【讨论】:

    • 谢谢。虽然我认为在上面的示例中 AdminModule 和 PageModule 仍然需要位于同一个命名空间中,因此仍然需要耦合?如有误解请见谅。
    • 是的,您可能会在不提供 PageModule 的包的命名空间中拥有 ModuleSuperClass 和 BaseModule,而在提供的包中同时拥有 AdminModule 和 PageModule。
    • 恐怕这不适用于我在问题中指出的命名空间结构。 :( 不过谢谢。
    • 你可以在另一个不知道 PageModule 的包中拥有一个完全不同的 AdminModule,但仍然通过扩展 BaseModule 来共享大部分功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多