使用遗留数据库的原则,从多个表中获取字段

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 数据透视表中删除小计

MYSQL查一个字段中 多个值

如何使用 SQLite 从数据库表中获取一个字段?

原则问题:无法从您发送到 GEOMETRY 字段的数据中获取几何对象

从多个表中获取唯一行