学说 - 从一个表中创建多个实体

时间:2014-12-04 15:15:36

标签: php mysql doctrine-orm refactoring

我目前正在开展巨大的重构项目。我们接管了一个经典的PHP / MySQL项目,其中大多数代码都是程序化的,重复的,并且几乎没有一个架构的暗示。

我打算使用Doctrine来处理我们的数据访问,并将所有表映射到实体。 然而,我们的MySQL表基本搞砸了。

我目前使用的表格有40多个列,并且无论如何都没有标准化。我们所拥有的一个简单示例:

品牌

id
name
poNumber
orderConfirmationEmail <---- these should go into a BrandConfirmations entity
shippingConfirmationEmail <-----
bill_address <---- these should go into a BrandAddress entity
bill_address2 <-----
city          <------
.
.
.

理想情况下,我希望Doctrine能够提取引用不同实体的字段,并将它们实际放入这些实体中。例如,id,name和poNumber将被拉入 Brand 实体。 orderConfirmationEmail和shippingConfirmationEmail将被拉入BrandNotification实体。接下来,bill_address和其余的地址字段将被拉出到BrandBillAddress实体中。有没有办法配置Doctrine将表拆分为这些模型,或者我是否必须自己自定义编写代码?

如果我必须自己编写代码来拆分此表,您是否有任何资源或建议可以解决类似的问题?我还没有找到很多。

1 个答案:

答案 0 :(得分:2)

最新版本的Doctrine 2支持他们所谓的嵌入式:http://doctrine-orm.readthedocs.org/en/latest/tutorials/embeddables.html。它可以解决你的一些问题。但是,它需要D2.5 +。目前,S2使用Doctrine 2.4。你可以尝试使用最新的学说。

您可以做的是让您的域模型(实体)充当您有价值对象的行为。所以$ brand-&gt; getOrderConfirmation()实际上会返回一个订单确认对象。你必须做一些搞乱的事情来保持一切映射到一个表,你可能会受限于你的一些查询,但它并不那么难。优点是其他新应用程序处理适当的规范化对象。它只是需要弄乱的内部持久性代码。

这种方法有很多链接。这是一个:http://russellscottwalker.blogspot.com/2013/11/entities-vs-value-objects-and-doctrine-2.html

当然,最好的办法是重构数据库架构。我喜欢将原始数据库的原始转储类型转换为具有所需对象嵌套的yaml文件。然后我将yaml文件加载到新架构中。如果您真的很幸运,那么您甚至可以为现有应用程序创建新视图,这将使其能够与您的新应用程序并行工作。