Doctrine多级继承映射

时间:2012-09-27 09:25:10

标签: php database oop orm doctrine-orm

我有四种类型的产品,我想在MySQL RDBMS上映射到Doctrine ORM结构。这些产品为PrepaidProductPostpaidProductMobilePrepaidProductMobilePostpaidProduct,具有以下结构:

abstract class Product {
    /**
     * @ORM\Column(type="integer")
     */
    private $price;

    ...
}

class PrepaidProduct extends Product {
    /**
     * @ORM\Column(type="integer")
     */
    private $credit;

    /**
     * @ORM\OneToMany(targetEntity="PrepaidDiscount")
     */
    private $prepaidDiscounts;
}

class PostpaidProduct extends Product {
    /**
     * @ORM\OneToMany(targetEntity="BundleMapping")
     */
    private $bundleMappings;
}

class MobilePrepaidProduct extends PrepaidProduct {
    /**
     * @ORM\ManyToOne(targetEntity="Device")
     */
    private $device;
}

class MobilePostpaidProduct extends PostpaidProduct {
    /**
     * @ORM\ManyToOne(targetEntity="Device")
     */
    private $device;
}

主要的想法是我想使用一个服务(工厂),它将使用PostpaidProduct类的基本类结构来创建相应的bundle映射的结构,所以我想我需要这个作为映射的超类。

在我看来,可行的方法是有两个单独的表,一个用于PostpaidProduct,一个用于PrepaidProduct,并且对MobilePostpaidProduct / {的表有一个单表继承{1}}和PostpaidProduct / MobilePrepaidProduct

你们觉得怎么样?有关最佳模拟方法的想法吗?

1 个答案:

答案 0 :(得分:0)

如果您正在使用RDBMS层[MySQL,Postgre],我认为您的提案是最佳选择。

如果子类有* 很少更多的属性,可能是关系,那么你实际上是在促进组合,你的数据表示不会稀疏[即你不会在主表中有很多空字段。

另一方面,如果你只想坚持使用作文[在大多数情况下更为明智] - $device是移动课程中唯一的附加关系吗?如果是这样,您可以在您的存储库类中编写一个findAllMobileProducts方法,该方法将返回设备不为null的每个产品,依此类推。