【问题标题】:Selectively inherit parts of an entity选择性地继承实体的部分
【发布时间】:2016-02-04 23:59:44
【问题描述】:

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

我想只从其中一列中删除一列或多列,同时保留继承。
我试图通过将父实体映射为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 章节没有给我任何选择。

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

有没有办法做到这一点?

【问题讨论】:

    标签: php symfony inheritance doctrine-orm


    【解决方案1】:

    您不能选择性地继承实体类的某些部分。听起来您需要重构您的 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
    }    
    

    【讨论】:

    • 感谢您的回答,我使用了 Trait 来保持所有实体都扩展父类。我减轻了父级并在特征中添加了额外的字段,现在我只需要根据实体使用特征。要点gist.github.com/chalasr/397c78596c0faa5f0820
    • @chalasr 这是一个很好的方法
    【解决方案2】:

    PHP 不允许通过继承删除类的功能,它只是为了处理相反的问题而设计和考虑的。

    http://php.net/manual/en/language.oop5.inheritance.php

    您可以使用特征和重构继承:

    <?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;
    }
    

    => 扩展Base 你没有foo

    【讨论】:

    • 我想你有点误解了我的问题。继承已经完成,我有许多从父级扩展的实体。父级包含protected 的映射属性。所以所有子实体都会自动继承父实体的属性。对于我的一个子实体,我希望排除继承的属性之一。另外,我重新更新了问题标题,使其更加准确。
    • 确实,我误会了!
    • 感谢您的工作,您的回答正是我使用的。我将接受@FuzzyTree 答案,因为这是第一个适当的答案,并且所有者已经确定了我的需求类别,我拥有执行逻辑所需的所有信息。这是我所做的事情的要点gist.github.com/chalasr/397c78596c0faa5f0820。希望你得到很多赞成票,至少你有我的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多