Doctrine orm 在原则2继承中通过映射覆盖反转

Doctrine orm 在原则2继承中通过映射覆盖反转,doctrine-orm,Doctrine Orm,我拥有以下实体: 高级餐厅 { /** *@OneToMany(targetEntity=“CollectionTime”,mappedBy=“restaurant”) */ 受保护的$collectionTimes; /** *@OneToMany(targetEntity=“DeliveryTime”,mappedBy=“restaurant”) */ 受保护的$deliveryTimes; } 映射到同一实体的两个子类: /** *@实体 *@InheritanceType(“单表”)

我拥有以下实体:

高级餐厅
{
/**
*@OneToMany(targetEntity=“CollectionTime”,mappedBy=“restaurant”)
*/
受保护的$collectionTimes;
/**
*@OneToMany(targetEntity=“DeliveryTime”,mappedBy=“restaurant”)
*/
受保护的$deliveryTimes;
}
映射到同一实体的两个子类:

/**
*@实体
*@InheritanceType(“单表”)
*@ORM\map({
*“CollectionTime”=“CollectionTime”,
*“DeliveryTime”=“DeliveryTime”
* })
*/
抽象类排序时间
{
/**
*@ManyToOne(targetEntity=“餐厅”)
*/
受保护的餐厅;
}
/**
*@实体
*/
类CollectionTime扩展了OrderTime
{
}
/**
*@实体
*/
类DeliveryTime扩展了OrderTime
{
}
现在的问题是,
orm:validate schema
报告以下错误:

  • 字段Restaurant#collectionTimes位于双向关系的反面,但目标实体CollectionTime#Restaurant上指定的mappedBy关联不包含所需的“inversedBy=collectionTimes”属性

  • 字段Restaurant#deliveryTimes位于双向关系的反面,但目标实体DeliveryTime#Restaurant上指定的mappedBy关联不包含所需的“inversedBy=deliveryTimes”属性

简言之,条令要求每个
mappedBy
在另一边有一个
inversedBy

到目前为止,我能看到的唯一解决方案是将
OrderTime::$restaurant
属性和映射移动到
CollectionTime
DeliveryTime
,以便能够添加适当的
反向映射:

抽象类OrderTime
{
}
/**
*@实体
*/
类CollectionTime扩展了OrderTime
{
/**
*@ManyToOne(targetEntity=“Restaurant”,inversedBy=“collectionTimes”)
*/
受保护的餐厅;
}
/**
*@实体
*/
类DeliveryTime扩展了OrderTime
{
/**
*@ManyToOne(targetEntity=“Restaurant”,inversedBy=“deliveryTimes”)
*/
受保护的餐厅;
}
但是它很麻烦,而且违背了继承的原则

有没有办法只覆盖子类中的
inversedBy
属性,而不必(重新)声明子类中的整个属性?

我已经研究了和,但它们似乎不是为此而设计的。

单向/双向 学说2使用单向关联和双向关联的概念

定义单向关联时,必须省略
inversedBy
参数,因为关联不是反向的

定义双向关联时,您必须在拥有方使用
inversedBy
参数(该方实际上包含所有元数据,以便正确映射关联),并且必须在反向方使用
mappedBy
参数(这样条令就知道在哪里可以找到关联的实际映射元数据)

因此,您要么同时使用
inversedBy
mappedBy
(双向),要么根本不使用它们(单向)

继承原则 但是它很麻烦,而且违背了继承的原则

我认为这取决于你如何看待它:

如果你只看代码(而不是映射),你是正确的。
OrderTime
的两个具体实现都共享一个属性
$restaurant
(可能还有getter、setter,可能还有其他逻辑),因此原则要求你在
OrderTime
中定义它

但是当您查看映射时,您有两个不同的关联:一个关联将
餐厅::$collectionTimes
CollectionTime::$Restaurant
联系在一起,另一个关联将
餐厅::$deliveryTimes
DeliveryTime::$Restaurant
联系在一起

因为这是两种不同的关联,所以条令要求你正确定义这两种关联才是公平的

您仍然可以通过以下方式坚持继承原则:在
OrderTime
中定义您需要的所有共享逻辑,即使是属性
$restaurant
,也不要添加映射元数据。在具体实现中,您可以使用适当的映射元数据重新声明属性
$restaurant

您必须在这些具体实例中重新声明属性
$restaurant
,唯一的原因是您正在使用注释来映射元数据。使用Yaml或XML时,您不必重新声明属性,因为映射元数据将位于单独的文件中

所以实际上,在这些具体实现中定义的不是代码/逻辑,而是映射元数据

价值对象 那些
OrderTime
类在我看来更像(而不是实体):


条令将支持从版本2.5()开始的值对象。

从条令2.6开始,您可以覆盖
inversedBy
。看起来是这样的:

/**
*@实体
*@ORM\AssociationOverrides({
*@ORM\AssociationOverride(name=“restaurant”,inversedBy=“collectionTimes”)
* })
*/
类CollectionTime扩展了OrderTime
{
}
/**
*@实体
*@ORM\AssociationOverrides({
*@ORM\AssociationOverride(name=“restaurant”,inversedBy=“deliveryTimes”)
* })
*/
类DeliveryTime扩展了OrderTime
{
}

谢谢你的回答。我授予奖金是为了避免失去任何机会,尽管我有一些评论;-)对我来说,在考虑这是否违反继承原则时,不应考虑映射,因此实际上只有一种方法来看待它。关于价值目标,我不认为他们是TBH,但如果你能证明,我会很高兴