2013-02-24 66 views
2

在我的PHP MVC應用程序中,我有三個主要實體:組織,僱員和角色。每個組織都有很多員工,每個員工都有一個角色。顯示清單:集合與陣列

對於給定的組織,我想顯示員工列表。對於每位員工,我將顯示姓名,地址詳細信息和角色名稱。

現在,據我所知,最有效的方法是爲我的服務層返回一個員工列表作爲一個數組,其中每個元素是一個數組字段(而不是一個對象)。在映射器中,我將角色表加入到employee表中,因此正確的角色名稱將位於初始結果集中,並且不需要再次查詢數據庫。

另一種方法是我的服務層返回一個Employee對象集合。然而,在這種情況下,每個Employee對象都需要查詢數據庫以找到它的角色的正確名稱(假設角色被延遲加載)。這會非常低效,但不知何故似乎更「面向對象」。

每當員工實例化時,我都可以考慮加載角色名稱作爲員工的一個屬性,但是我仍然需要保留對唯一角色ID的引用,因此我立即有同步注意事項。

什麼是解決這個問題的典型方法?我相信它已經解決了數百萬次!

謝謝!

+1

體面的ORM應該能夠獲得有關員工名單及其角色的信息,並返回一個Employee對象列表,每個Employee都有一個Role類型的字段,其中包含有關其角色的信息。 – 2013-02-24 09:09:59

+1

沒有什麼能夠阻止你使用第一個替代方法而不是數組。 Voilá,高效*和*面向對象。 – 2013-02-24 09:30:40

+0

你好,我該怎麼辦?同時生成一個Employee集合和一個相關的Role集合? – 2013-02-24 10:43:11

回答

1

確實,這個東西是非常標準的。但我仍然與它鬥爭。

我首先想到的是要建立這樣的:

class Employee 
{ 
    protected $name; //etc 

    /** 
    * @var Organization 
    */ 
    protected $organization; 

    /** 
    * @var Role 
    */ 
    protected $role; 

    // And then getters/setters for Role and Organization 
} 

然後一個EmployeeMapper類似:

class EmployeeMapper 
{ 
    /** 
    * @Var DB 
    */ 
    protectd $db; 

    public function __construct(DB $db) 
    { 
     $this->db = $db 
    } 

    public function getEmployeesByOrganization($orgId) 
    { 
     // query here that joins employees, roles, and organizations 
    } 
} 

這令我乾淨,代表你所描述的結構。

但問題是,當EmployeeMapper必須構造Employee對象 時,他需要知道連接查詢結果中的角色字段和組織字段如何映射到角色和組織字段對象。對我而言,這些知識應該嚴格限制在RoleMapper和OrganizationMapper中。因此,也許這些映射器需要使這個映射功能可用作爲公共方法,並且我們需要有一種方法將RoleMapper和OrganizationMapper實例注入到EmployeeMapper中以供使用。有關基於ZF的示例,請參閱Surviving The Deep End

此外,似乎有時候 - 例如您提供的「員工視圖列表」 - 您想要獲得有關角色和組織實體附加信息。在這種情況下,加入和構建對象圖的開銷是合理的(當然比爲角色和組織進行單獨的查詢循環更好)。但在其他情況下,您確實只需要爲單個員工提供一些簡單的員工信息,例如他的姓名或電話號碼。在後一種情況下,爲什麼會產生加入和構建完整對象圖的開銷?

這些問題有架構解決方案,通常使用代理對象(代表角色和組織對象,並在需要時延遲加載它們)和自定義存儲庫對象(您要強制連接的位置)。

但我覺得自己構建這一切是一種痛苦。最後,我發現一個像Doctrine這樣的ORM已經完全掌握了它,併爲我提供了上述功能(代理,自定義存儲庫等)。

+0

真棒大衛,非常感謝。 – 2013-02-25 04:13:11