【问题标题】:Doctrine2: Mapping a parent class field from a child, how?Doctrine2:从孩子映射父类字段,如何?
【发布时间】:2011-09-25 18:59:56
【问题描述】:

我想知道这是否可以使用 Doctrine 注释来完成:

假设你有一个父类(映射的超类):

abstract class AbstractParent {
    protected $foo;
}

作为两个子类:

class ConcreteChild1 extends AbstractParent {
    /**
     * @OneToOne(targetEntity="SomeEntity")
     */
    // How can I map this to foo above?
}

class ConcreteChild2 extends AbstractParent {
    /**
     * @OneToOne(targetEntity="SomeOtherEntity")
     */
    // How can I map this to foo above?
}

SomeEntitySomeOtherEntity 都共享相同的父接口 (SomeEntityInterface) 但我不想仅将映射超类 AbstractParent 上的 $foo 字段映射到此父接口 (SomeEntityInterface ) 因为原则会产生性能开销(它会丢失延迟加载以映射层次结构中的高位类)(即我不想使用单表或类表继​​承)。

使用 YML 解决方案很简单,因为您仍然可以映射 foo,即使它位于父类上:

ConcreteChild1:
type: entity
oneToOne:
  foo:
    targetEntity: SomeEntity

ConcreteChild2:
type: entity
oneToOne:
  foo:
    targetEntity: SomeOtherEntity

那么我必须使用 YML 还是我缺少的东西可以让我通过注释映射 $foo

提前非常感谢,我知道这有点难以理解!

【问题讨论】:

    标签: php doctrine-orm symfony


    【解决方案1】:

    嗯,这取决于。您是否使用注释在 YML 中做您正在做的事情,您只需在每个具体类中定义 $foo 并在那里对其进行注释,就像您在 YML 中所做的那样。

    如果 $foo 始终指向相同类型的实体,您可以在抽象基类上使用 @MappedSuperclass,然后在此处定义关系。

    如果 SomeEntity 和 SomeOtherEntity 都是 SomeCommonFooAncestor 的子类,这也可以工作,在这种情况下,您可以使用 @MappedSuperclass 并说 AbstractParent 有一个 @OneToOne(targetEntity="SomeCommonFooAncestor")。但是,serious performance considerations 使用这种方法处理 @OneToOne 和 @ManyToOne 关系(但你可能会接受)

    【讨论】:

    • 重新声明字段,有意思。在我上面的示例中,AbstractParent 类在其某些方法中确实使用了$foo,从域模型的角度来看,没有太多理由在子类中重新声明受保护的字段,所以我从未尝试过。 .. 我会试一试,看看 PHP 是否允许。仅执行 STI 或 CTI 对性能的影响是不可接受的,因为 $foo 实际上是一个 ArrayCollection 关联。如果这不适用于注释,我将把它归结为 YML 允许它,因为它更加解耦。感谢您的回复!
    • 刚刚实现了解决方案,我在子类中重新声明$foo 并针对它们指向的实体类型为字段提供其特定注释 - 似乎工作正常!我认为我现在能够重用我的抽象类逻辑,同时不会因为在$foo 上将超类作为实体类型而产生 Doctrine 开销,我认为我得到了大多数世界中最好的。我不会介意 YML,因为它更加解耦,但我认为我不想在实现和元文件之间不断变化。再次感谢您的帮助 timdev!
    • 没问题。如果是同一类型,则重新声明它两次是不合适的,但它引用不同实体的事实意味着它实际上是两个不同的东西。如果这两个实体有一个共同的祖先,那么理想情况下,您希望抽象父对象中只有一个 foo,它属于该祖先类型。
    猜你喜欢
    • 1970-01-01
    • 2012-04-06
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多