使用遗留数据库的原则,从多个表中获取字段
Posted
技术标签:
【中文标题】使用遗留数据库的原则,从多个表中获取字段【英文标题】:Doctrine with legacy database, get fields from multiple tables 【发布时间】:2014-02-05 09:38:06 【问题描述】:我需要一个数据映射/存储库解决方案,并且希望避免自己编写。
Doctrine 似乎满足了除一个之外的所有要求,但我只是不知道该怎么做。
我正在使用旧数据库,我希望我的域对象与数据库完全无关,直到我们能够逐步淘汰旧应用程序(这将至少需要一年时间)。这意味着我需要一种将其他表中的字段添加到实体的方法。
这是一个例子:
<?php
namespace Entities;
class Article
protected $id;
protected $name; // from article table
protected $description; // from article_info table, joined from article table
protected $stock; // from article_variation_info, joined from article_info table
...
教义文档似乎指出了两种可能的解决方案:
为所有表创建实体,然后使用自定义 getter/setter 将字段添加到实体 使用本机 SQL 获取实体数据和每个存储库查询 (see here)我想避免第一个选项,因为我想为新应用程序创建一个干净的域模型,摆脱过去的旧限制/错误决定。必须为每个表创建实体似乎会适得其反。
第二个选项似乎好一点,但如果我必须编写所有 SQL,我不妨编写自己的 PDO 存储库和映射器。
我是否遗漏了什么,或者说教条不是我想要做的事情的理想解决方案?
【问题讨论】:
考虑使用 SQL 视图。 @Cerad 我确实考虑过,但插入等似乎不起作用。至少不在 MSSQL 上, 你能写(插入/更新)到真实的表,并且只使用视图来读取类模型吗?或者,如果您想尝试写入视图,should be possible on SQL Server,具体取决于您构建视图的方式。 【参考方案1】:Doctrine 2 不适合您的问题。它真的想要每个实体关系一张表。另一方面,一旦你过渡,一切都会好起来的。
我确实认为视图是您最好的解决方案。我知道能力有限,但你应该能够克服它。
但是,您的第一个选项是可行的。重要的是你的新模型有一个漂亮干净的界面。您的应用程序只知道模型接口。模型层将没有持久性代码。
NewModel
NewArticleModel implements NewArticleModelInterface
NewArticleModelInterface
NewArticleRepositoryInterface
NewEntity
NewArticleEntity extends NewArticleModel
NewArticleEntityRepository implements NewArticleRepositoryInterface
OldEntity
OldArticleDoctrineEntity
OldArticleDoctrineRepository
诀窍是让 NewArticleEntityRepository 负责从 OldArticleDoctrineEntity 构建 NewArticleEntity。
最终,当数据库更新为直接支持 NewArticleEntity 时,您只需要调整存储库或插入一个新的存储库。同样,您的应用程序只知道模型级接口。
事实上,无论您采取何种方法,创建一个持久性中立模型层都可能是开始的方式。
【讨论】:
以上是关于使用遗留数据库的原则,从多个表中获取字段的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP 和 mysqli 从多个 MySQL 表中获取数据
如何使用 vba 从具有多个数据字段的 excel 数据透视表中删除小计