我有四种类型的产品,我想将它们映射到 MySQL RDBMS 上的 Doctrine ORM 结构。产品是 PrepaidProduct , PostpaidProduct , MobilePrepaidProduct , MobilePostpaidProduct ,结构如下:

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 类的基本类结构来创建相应包映射的结构,所以我想我需要它作为映射的父类(super class)。

在我看来,要走的路是有两个单独的表,一个用于 PostpaidProduct ,一个用于 PrepaidProduct ,并且对 MobilePostpaidProduct/PostpaidProductMobilePrepaidProduct/PrepaidProduct 的表具有单表继承。

你们有什么感想?关于建模的最佳方法的任何想法?

最佳答案

如果您像我认为的那样使用 RDBMS 层 [MySQL、Postgre],那么您的建议是我认为的最佳选择。

如果子类有更多的属性,最重要的可能是关系,那么您实际上是在促进组合,并且您的数据表示将不会稀疏 [即主表中不会有很多空字段]。

另一方面,如果您只想坚持组合 [在大多数情况下更可取] - $device 是 Mobile 类中唯一的附加关系吗?如果是这样,您可以在存储库类中编写一个 findAllMobileProducts 方法,该方法将返回设备不为空的每个产品,依此类推。

关于php - Doctrine 多级继承映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12618161/

10-12 01:12