我有四种类型的产品,我想将它们映射到 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
/PostpaidProduct
和 MobilePrepaidProduct
/PrepaidProduct
的表具有单表继承。你们有什么感想?关于建模的最佳方法的任何想法?
最佳答案
如果您像我认为的那样使用 RDBMS 层 [MySQL、Postgre],那么您的建议是我认为的最佳选择。
如果子类有更多的属性,最重要的可能是关系,那么您实际上是在促进组合,并且您的数据表示将不会稀疏 [即主表中不会有很多空字段]。
另一方面,如果您只想坚持组合 [在大多数情况下更可取] - $device
是 Mobile 类中唯一的附加关系吗?如果是这样,您可以在存储库类中编写一个 findAllMobileProducts
方法,该方法将返回设备不为空的每个产品,依此类推。
关于php - Doctrine 多级继承映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12618161/