2014-02-05 29 views
2

我需要一個數據映射/存儲庫解決方案,並希望避免必須寫我自己的。與遺留數據庫學說,從多個表中獲取字段

主義似乎滿足除了一個的所有要求,但我只是不知道該怎麼做。

我正在使用遺留數據庫,我希望我的域對象與數據庫完全無關,直到我們能夠逐個淘汰舊應用程​​序部分(至少需要一年)。這意味着我需要一種方法將其他表中的字段添加到實體中。

下面是一個例子:

<?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

考慮使用SQL視圖。 – Cerad

+0

@Cerad我確實認爲,但插入等似乎沒有工作。至少不在MSSQL上, – Patrick

+0

你可以寫入(插入/更新)真實的表格,只是使用視圖來讀取類模型?或者,如果您想嘗試寫入視圖,則[應該可以在SQL Server上](http://stackoverflow.com/a/3127568/472495),具體取決於您構建視圖的方式。 – halfer

回答

2

學說2不適合你的問題。它真的需要每個實體關係的一個表。另一方面,一旦你過渡,那麼事情就會很好。

我認爲意見是你最好的解決方案。我知道能力有限,但你應該能夠通過它。

但是,您的第一個選項是可行的。重要的是,你有一個很好的清潔界面,爲您的新模型。您的應用程序只知道模型接口。模型層將不會有持久性代碼。

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

訣竅是讓NewArticleEntityRepository負責建設NewArticleEntity出來的OldArticleDoctrineEntity的。

最後,當數據庫被更新爲直接支持NewArticleEntity時,您只需調整存儲庫或者插入一個新的存儲庫。同樣,您的應用程序只知道模型級別接口。

實際上,不管採取什麼方法,創建一個持久性中性模型層可能是開始的方式。