gpt4 book ai didi

php - 与 Doctrine2 的多态关系

转载 作者:可可西里 更新时间:2023-11-01 12:37:14 27 4
gpt4 key购买 nike

如何使用 Doctrine 2 创建传统的多态关系?

我已经阅读了很多建议使用单表继承的答案,但我看不出这对我的情况有何帮助。这是我正在尝试做的事情:

我有一些实用实体,例如地址、电子邮件和电话号码。

我有一些“可联系”实体,例如客户、雇主、企业。其中每一个都应包含与上述实用程序实体的 OneToMany 关系。

理想情况下,我想创建一个包含这些关系的名为“ContactableEntity”的抽象基类,但我知道不可能将 OneToMany 关系放入具有原则的映射父类(super class)中——这很好。

但是,我仍然不知道如何在没有大量代码冗余的情况下关联这些。我是否将 Address 设为 STI 类型,并使用包含直接与客户的关系的“CustomerAddress”子类?有没有办法减少重复量?

最佳答案

为什么不让您的基础 ContactableEntity 具体化?

编辑:

我刚刚在一个使用 CTI 的项目中做了一些实验。我看不出有任何理由表明相同的策略不适用于 STI。

基本上,我有类似的东西:

/**                                                                                                                                                                                                                                                                                      
* Base class for orders. Actual orders are some subclass of order.
*
* @Entity
* @Table(name="OOrder")
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"CAOrder" = "CAOrder", "AmazonOrder" = "AmazonOrder"})
*/
abstract class Order {
/**
* CSRs can add notes to orders of any type
* @OneToMany(targetEntity = "OrderNote", mappedBy = "order", cascade={"all"})
* @OrderBy({"created" = "ASC"})
*/
protected $notes;

// ...
}

/**
* @Entity
*/
class AmazonOrder extends Order {

/**
* @Column(type="string", length="20")
*/
protected $amazonOrderId;

// ...

}

/**
* @Entity
*/
class OrderNote {
// ...

/**
* @ManyToOne(targetEntity="Order", inversedBy="notes")
*/
protected $order;

// ...
}

它似乎完全按照预期工作。我可以获得一个 OrderNote,它的 $order 属性将包含 Order 的一些子类。

使用 STI 是否有一些限制使您无法做到这一点?如果是这样,我建议转到 CTI。但我无法想象为什么这不适用于 STI。

关于php - 与 Doctrine2 的多态关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7869645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com