我有以下实体:
class Restaurant
{
/**
* @OneToMany(targetEntity="CollectionTime", mappedBy="restaurant")
*/
protected $collectionTimes;
/**
* @OneToMany(targetEntity="DeliveryTime", mappedBy="restaurant")
*/
protected $deliveryTimes;
}
映射到同一实体的两个子类:
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorMap({
* "CollectionTime" = "CollectionTime",
* "DeliveryTime" = "DeliveryTime"
* })
*/
abstract class OrderTime
{
/**
* @ManyToOne(targetEntity="Restaurant")
*/
protected $restaurant;
}
/**
* @Entity
*/
class CollectionTime extends OrderTime
{
}
/**
* @Entity
*/
class DeliveryTime extends OrderTime
{
}
现在的问题是,doctrine orm:validate-schema
报告以下错误:
-
字段 Restaurant#collectionTimes 位于双向关系的反面,但目标实体 CollectionTime#restaurant 上指定的mappedBy 关联不包含所需的“inversedBy=collectionTimes”属性。
-
字段 Restaurant#deliveryTimes 位于双向关系的反面,但目标实体 DeliveryTime#restaurant 上指定的mappedBy 关联不包含所需的“inversedBy=deliveryTimes”属性。
简而言之,教义期望每一个mappedBy
拥有一个inversedBy
另一方面。
到目前为止我能看到的唯一解决方案是移动OrderTime::$restaurant
属性并映射到CollectionTime
and DeliveryTime
,只是为了能够添加适当的inversedBy
映射:
abstract class OrderTime
{
}
/**
* @Entity
*/
class CollectionTime extends OrderTime
{
/**
* @ManyToOne(targetEntity="Restaurant", inversedBy="collectionTimes")
*/
protected $restaurant;
}
/**
* @Entity
*/
class DeliveryTime extends OrderTime
{
/**
* @ManyToOne(targetEntity="Restaurant", inversedBy="deliveryTimes")
*/
protected $restaurant;
}
但这样比较麻烦,而且违背了继承的原则。
有没有办法覆盖inversedBy
子类中的属性,而不必在子类中(重新)声明整个属性?
我调查过@AssociationOverrides http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html#association-override and @AttributeOverrides http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html#attribute-override,但它们似乎不是为此目的而设计的。