我有以下实体:
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
报告以下错误:简而言之,Doctrine期望每个
mappedBy
在另一侧都有一个inversedBy
。到目前为止,我唯一能看到的解决方案是将
OrderTime::$restaurant
属性和映射移动到CollectionTime
和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和@AttributeOverrides,但是它们似乎并不是为此目的而设计的。
最佳答案
自Doctrine 2.6起,您可以覆盖inversedBy
。看起来像这样:
/**
* @Entity
* @ORM\AssociationOverrides({
* @ORM\AssociationOverride(name="restaurant", inversedBy="collectionTimes")
* })
*/
class CollectionTime extends OrderTime
{
}
/**
* @Entity
* @ORM\AssociationOverrides({
* @ORM\AssociationOverride(name="restaurant", inversedBy="deliveryTimes")
* })
*/
class DeliveryTime extends OrderTime
{
}
关于doctrine-orm - 教义2继承中的替代inversedBy映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22745653/