带有遗留数据库的Doctrine,从多个表中获取字段

时间:2014-02-05 09:38:07

标签: php doctrine-orm 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存储库和映射器。

我是否遗漏了某些东西或者说教条不是我想要做的理想解决方案?

1 个答案:

答案 0 :(得分:2)

学说2不适合你的问题。它真的想要每个实体关系一个表。另一方面,一旦你过渡,事情就会好起来。

我认为观点是您最好的解决方案。我知道能力有限,但你应该能够解决它。

但是,您的第一个选择是可行的。重要的是,您的新模型有一个很好的清洁界面。您的应用程序只知道模型接口。模型层中没有持久性代码。

NewModel
    NewArticleModel implements NewArticleModelInterface
    NewArticleModelInterface
    NewArticleRepositoryInterface
NewEntity
    NewArticleEntity extends NewArticleModel
    NewArticleEntityRepository implements NewArticleRepositoryInterface
OldEntity
    OldArticleDoctrineEntity
    OldArticleDoctrineRepository

诀窍是让NewArticleEntityRepository负责从OldArticleDoctrineEntity中构建NewArticleEntity。

最后,当数据库更新为直接支持NewArticleEntity时,您只需要调整存储库或插入新的存储库。再次,您的应用程序只知道模型级接口。

事实上,无论采用何种方法,创建持久性中性模型层可能都是开始的方式。