我有以下实体:

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属性和映射移动到CollectionTimeDeliveryTime,以便能够添加适当的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/

10-11 03:16