有选择地继承实体的一部分

时间:2016-02-04 23:59:45

标签: php symfony inheritance doctrine-orm

我有许多实体从一个父实体扩展。

我想从其中一个中删除一个或多个列,同时保留继承 我试图通过将父实体映射为MappedSuperClass来找到解决方案,但它没有帮助。

示例:

<?php

/** @ORM\Entity */
class Base
{
    /** @ORMColumn(name="foo", type="string") */
    protected $foo;

    /** @ORMColumn(name="bar", type="string") */
    protected $bar

}

/**
 * @ORM\Entity
 */
class Child extends Base
{
    // How take only the Base::$bar column mapping 
    // and not the Base::$foo column mapping
}

学说文档的整个Inheritance mapping章节并没有给我任何替代方案。

我需要真正删除/排除数据库中的列,序列化并不能解决我的问题。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

PHP不允许通过继承来删除类的功能,它只是被制作并被认为处理相反的事情。

请参阅http://php.net/manual/en/language.oop5.inheritance.php

您可以使用traits和refactor inheritance:

<?php

trait BaseFooTrait
{
    /** @ORM\Column(name="foo", type="string") */
    protected $foo;

    // ... getter and setter
}

/**
 * @ORM\Entity
 */
class Base
{
    /** @ORM\Column(name="bar", type="string") */
    protected $bar;

    // ... getter and setter
}

/**
 * @ORM\Entity
 */
class FooBase extends Base
{
    use BaseFooTrait;
}

=&GT;延长Base您没有foo

答案 1 :(得分:2)

您无法有选择地继承实体类的某些部分。听起来你需要重构你的Base类,或者根据你的其他类在彼此之间共享的属性引入另一个抽象类。

/**
 * @MappedSuperclass
 */
class Base
{
    /** @ORMColumn(name="foo", type="string") */
    private $foo;
}

/**
 * @MappedSuperclass
 */
class SomeOtherBase extends Base
{
    /** @ORMColumn(name="bar", type="string") */
    private $bar
}


/**
* @ORM\Entity
*/
class Child extends Base
{
    // How take only the Base::$bar column mapping 
    // and not the Base::$foo column mapping
}