Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2:如何从子类映射父类字段?_Php_Doctrine Orm_Symfony - Fatal编程技术网

Php Doctrine2:如何从子类映射父类字段?

Php Doctrine2:如何从子类映射父类字段?,php,doctrine-orm,symfony,Php,Doctrine Orm,Symfony,我想知道是否可以使用条令注释来实现这一点: 假设您有一个父类(映射的超类): 其中包括两个儿童班: class ConcreteChild1 extends AbstractParent { /** * @OneToOne(targetEntity="SomeEntity") */ // How can I map this to foo above? } class ConcreteChild2 extends AbstractParent { /

我想知道是否可以使用条令注释来实现这一点:

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

其中包括两个儿童班:

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?
}
SomeEntity
SomeOtherEntity
都共享相同的父接口(
SomeEntityInterface
),但我不想只将映射的超类
AbstractParent
上的
$foo
字段映射到此父接口(
SomeEntityInterface
),因为这会导致性能开销(映射层次结构中较高级别的类会丢失延迟加载)(即,我不想使用单表或类表继承)

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

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

所以,我必须使用YML,还是缺少一些东西,可以通过注释映射
$foo


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

好吧,这要看情况而定。如果你用注释在YML中做你正在做的事情,你只需要在每个具体类中定义$foo并在那里注释它,就像你在YML中做的那样

如果$foo总是指向同一类型的实体,那么可以在抽象基类上使用,然后在那里定义关系


如果SomeEntity和SomeOtherEntity都是某个CommonFooSenator的子类,那么这也可以起作用,在这种情况下,您可以使用@MappedSuperclass,并说AbstractParent有一个
@OneToOne(targetEntity=“someCommonFooSenator”)
。然而,对于@OneToOne和@ManyToOne关系来说,这种方法是不可行的(但你可能不会介意)

好吧,这要看情况而定。如果你在YML中使用注释进行操作,你只需在每个具体类中定义$foo并在那里进行注释,就像在YML中一样

如果$foo总是指向同一类型的实体,那么可以在抽象基类上使用,然后在那里定义关系


如果SomeEntity和SomeOtherEntity都是某个CommonFooSenator的子类,那么这也可以起作用,在这种情况下,您可以使用@MappedSuperclass,并说AbstractParent有一个
@OneToOne(targetEntity=“someCommonFooSenator”)
。然而,对于@OneToOne和@ManyToOne关系来说,这种方法是不可行的(但你可能不会介意)

字段的重新声明,很有意思。在我上面的例子中,类
AbstractParent
实际上在它的一些方法中使用了
$foo
,从域模型的角度来看,没有太多理由在子类中重新声明受保护的字段,所以我从未尝试过它……我将尝试一下,看看PHP是否允许它仅仅做STI或CTI的rmance影响是不可接受的,因为$foo实际上是一个
数组集合
关联。如果这对注释不起作用,我就把它记在YML上,因为它更解耦。谢谢你的回复!刚刚实现了解决方案,我在子类和子类中重新声明了
$foo
就字段所指向的实体类型为字段提供特定的注释-似乎很好!我想我现在已经充分利用了大多数世界,能够重用我的抽象类逻辑,同时不会因为在
$foo
上使用超类作为实体类型而招致理论开销。我不会介意YML,因为它更复杂eCooplied,但我认为我更喜欢不必经常在实现和元文件之间进行更改。再次感谢您的帮助,timdev!没问题。如果是同一类型,则重新声明两次是不合适的,但它引用不同的实体这一事实意味着它实际上是两件不同的事情。如果这两个实体有一个共同点stor,理想情况下,您希望在该祖先类型的抽象父级中有一个单一的foo。字段的重新声明很有趣。在我上面的示例中,类
AbstractParent
实际上在其某些方法中使用了
$foo
,从域模型的立场来看,没有太多理由在子级中重新声明受保护的字段类,所以我从未尝试过它…我将试一试,看看PHP是否允许它。只做STI或CTI对性能的影响是不可接受的,因为$foo实际上是一个
ArrayCollection
关联。如果这对注释不起作用,我将把它记在YML上,因为它更解耦。谢谢你的回复!只是实现了一个解决方案,我在子类中重新声明
$foo
,并为字段提供与它们指向的实体类型相关的特定注释-似乎工作得很好!我认为我现在能够充分利用大多数世界,能够重用我的抽象类逻辑,同时不会因为使用超类而产生理论开销ss作为
$foo
上的实体类型。我不会介意YML,因为它更解耦,但我认为我更喜欢不必在实现和元文件之间不断更改。再次感谢您的帮助,timdev!没问题。如果是同一类型,则重新声明两次是不合适的,但它引用的是不同的实体意味着它实际上是两个不同的东西。如果这两个实体有一个共同的祖先,那么理想情况下,您希望抽象父对象中有一个属于该祖先类型的foo。
ConcreteChild1:
type: entity
oneToOne:
  foo:
    targetEntity: SomeEntity
ConcreteChild2:
type: entity
oneToOne:
  foo:
    targetEntity: SomeOtherEntity