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,但如果你能证明,我会很高兴