如何使用Doctrine 2创建传统的多态关系?
我已经阅读了许多建议使用单表继承的答案,但我看不出这对我的情况有何帮助.这是我正在尝试做的事情:
我有一些实用程序实体,如地址,电子邮件和电话号码.
我有一些"可联系"的实体,如客户,雇主,商业.其中每个都应包含与上述实用程序实体的OneToMany关系.
理想情况下,我想创建一个名为'ContactableEntity'的抽象基类,它包含这些关系,但我知道不可能将OneToMany关系放在带有教义的映射超类中 - 这没关系.
但是,如果没有代码中的大量冗余,我仍然不知道如何将它们联系起来.我是否将地址设为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;
// ...
}
Run Code Online (Sandbox Code Playgroud)
它似乎完全按预期工作.我可以得到一个OrderNote,它的$order属性将包含Order的一些子类.
使用STI是否有一些限制使得这对你不可能?如果是这样,我建议转到CTI.但我无法想象为什么这对STI无效.
| 归档时间: |
|
| 查看次数: |
1917 次 |
| 最近记录: |