php - Doctrine - 从一个表中创建多个实体

标签 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 为我将表格拆分成这些模型,或者我必须自己自定义编写代码才能做到这一点?

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

最佳答案

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

您可以做的是让您的域模型(实体)表现得好像您拥有值对象一样。所以 $brand->getOrderConfirmation() 实际上会返回一个订单确认对象。您必须做一些事情才能将所有内容映射到一张表,并且您可能会在某些查询上受到限制,但这并不难。优点是您的其他新应用程序可以处理适当的规范化对象。只有内部持久性代码需要弄乱。

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

您最好的选择当然是重构您的数据库架构。我喜欢将原始数据库原始转储到具有所需对象嵌套的 yaml 文件中。然后我将 yaml 文件加载到新架构中。如果您真的很幸运,那么您甚至可以为现有应用程序创建新 View ,这将允许它与您的新应用程序保持并行工作。

关于php - Doctrine - 从一个表中创建多个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27297476/

相关文章:

php - 无法从数据库(数组)回显数据,PHP

mysql - 如何使用 Java(JDBC、MySQL)创建带有 DATETIME DEFAULT 的表

MySQL 将传统小数转换为毫秒

c# - 如何显示自指表?

php - 学说的createQuery中的子查询

persistence - Doctrine 2,需要执行代码 pre-persist/post-persist

php - 如何在多个子域中使用公共(public) header

javascript - 在javascript中使用post数组传递数据

mysql - 提高大型 Doctrine 查询的性能

php - Laravel 多对多关系获取数据