Doctrine实体如何包含扩展的映射超类的实例?

时间:2019-02-21 15:20:15

标签: oop inheritance orm doctrine-orm doctrine

EntitySubClass1EntitySubClass2EntitySubClass3都扩展了MappedSuperclassBase

MappedSuperclassBase

/** @MappedSuperclass */
class MappedSuperclassBase
{
    /** @Column(type="integer") */
    protected $mapped1;
    /** @Column(type="string") */
    protected $mapped2;
    /**
     * @OneToOne(targetEntity="MappedSuperclassRelated1")
     * @JoinColumn(name="related1_id", referencedColumnName="id")
     */
    protected $mappedRelated1;

    // ... more fields and methods
}

EntitySubClass1

/** @Entity */
class EntitySubClass1 extends MappedSuperclassBase
{
    /** @Id @Column(type="integer") */
    private $id;
    /** @Column(type="string") */
    private $name;

    // ... more fields and methods
}

EntitySubClass2

/** @Entity */
class EntitySubClass2 extends MappedSuperclassBase
{
    /** @Id @Column(type="integer") */
    private $id;
    /** @Column(type="string") */
    private $name;

    // ... more fields and methods
}

EntitySubClass3

/** @Entity */
class EntitySubClass3 extends MappedSuperclassBase
{
    /** @Id @Column(type="integer") */
    private $id;
    /** @Column(type="string") */
    private $name;

    // ... more fields and methods
}

SomeOtherClass包含扩展MappedSuperclassBase的三个对象之一的单个实例。此外,这三个对象的单个实例必须属于SomeOtherClass的一个实例,并且只能属于一个(即不为零)

要使用Doctrine实现此目的,我正在考虑执行以下操作:

/** @Entity */
class SomeOtherObject
{
    // ...

    /**
     * One SomeOtherObject has One MappedSuperclassBase.
     * @OneToOne(targetEntity="MappedSuperclassBase", mappedBy="someOtherObject")
     */
    private $mappedSuperclassBase;

    // ...
}

/** @MappedSuperclass */
class MappedSuperclassBase
{
    // ...

    /**
     * One MappedSuperclassBase has One SomeOtherObject.
     * @OneToOne(targetEntity="SomeOtherObject", inversedBy="mappedSuperclassBase")
     * @JoinColumn(name="someOtherObject_id", referencedColumnName="id")
     */
    private $someOtherObject;

    // ...
}

该映射有效,并且能够生成架构,但是在创建SomeOtherClass对象时,我得到了MappedSuperclassBase table does not exist

重新阅读documentation后,我看到映射的超类必须是单向的(仅具有拥有方)

  

映射的超类不能是实体,它不可查询,并且   映射超类定义的持久关系必须是   单向的(仅具有拥有方)。这意味着一对多   映射超类根本不可能建立关联。   此外,仅当已映射时,才可能有多对多关联   目前,仅在一个实体中使用超类。对于   继承的进一步支持,单表或联接表继承   功能必须使用。

好的,我知道我的尝试没有遵循文档。话虽如此,我应该如何执行上述要求?是否可以使用映射的超类,或者我是否需要将CTI与Abstractclassbase一起使用,除了SomeOtherClass的{​​{1}}之外什么都不包含,并且会受到其他联接的惩罚? >

0 个答案:

没有答案