与Doctrine2的多态关系

Tyl*_*mer 8 php doctrine-orm

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

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

我有一些实用程序实体,如地址,电子邮件和电话号码.

我有一些"可联系"的实体,如客户,雇主,商业.其中每个都应包含与上述实用程序实体的OneToMany关系.

理想情况下,我想创建一个名为'ContactableEntity'的抽象基类,它包含这些关系,但我知道不可能将OneToMany关系放在带有教义的映射超类中 - 这没关系.

但是,如果没有代码中的大量冗余,我仍然不知道如何将它们联系起来.我是否将地址设为STI类型,其中"CustomerAddress"子类包含直接与客户的关系?有没有办法减少重复次数?

tim*_*dev 5

为什么不让您的基础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无效.

  • 那是因为您使用的是MappedSuperClass -使其改为Entity(它仍然可以是抽象类),我怀疑您会很好。 (2认同)