2010-11-18 28 views
0

例如:在Zend框架中使用數據映射器

我需要檢索一組男性用戶的ID,名字和姓氏,但沒有別的。

所以我在UserMapper中有一個名爲fetchAllMaleUsers()的函數,它返回一組用戶實體。

即:

public function fetchAllMaleUsers() { 
     $select = $this->getDbTable() 
         ->select() 
         ->from($this->getDbTable(), 
           array('ID', 'FirstName', 'LastName')) 
         ->where('Gender = ?', 'M'); 

     $resultSet = $this->getDbTable()->fetchAll($select); 

     $users = array(); 
     foreach ($resultSet as $row) { 
      $user = new Application_Model_User(); 
      $user->setId($row->ID) 
       ->setFirstName($row->FirstName) 
       ->setLastName($row->LastName); 
      $users[] = $user; 
     } 

     return $users; 
    } 
  1. ,這種功能在映射層屬於?
  2. 可以只設置每個用戶實體的Id,Firstname和LastName嗎?

回答

1

1)完美地爲映射器/網關或罰款,但你叫它。 2)你可以做但我非常不鼓勵這個。爲什麼?稍後在你的應用程序中,你無法分辨你從哪裏獲得模型。所以你必須檢查模型中的值是否設置在每次你不確定它是否被設置,或者你需要一些自動加載的東西來彌補缺失值(這與缺少東西一樣糟糕)。另一個原因是,您不能在其他可能需要用戶模型的其他屬性的位置重用該功能。 afaik的最後一個原因是,模型在任何時候代表完整的實體,而不是其中的一部分。並沒有真正的理由爲什麼不加載所有的領域(除了引用其他實體,爲什麼要自動加載)。

+0

謝謝,我只是猶豫不決,因爲查詢每一列似乎是不必要的數據庫計算。但也許這不是問題。所以每當我嘗試獲取用戶實體的屬性時,我都應該將每個列映射到用戶實體? – Craig 2010-11-18 23:03:30

+1

@克雷格:是的。事實上,人們往往首先在錯誤的地方優化。從相同的db-table獲取額外的列幾乎沒有開銷(當然,如果你在那裏存儲二進制數據...)。如果你想優化你的應用程序,zend框架和你的php代碼是一個好的開始(以及更復雜的db-queries或db-layout)。一個好的開始,讓behing模式/ mapper的東西是(和你的其他評論)是http://www.survivethedeepend.com/zendframeworkbook/en/1.0和http://weierophinney.net/matthew/archives/ 202-Model-Infrastructure.html – Fge 2010-11-18 23:54:31

0

除了Fge的回覆,我相信$ resultSet應該已經返回了Application_Model_User類型的值。如果沒有,您可能需要在Application_Model_DbTable_User中設置$ _rowClass。

+0

嗯,我基於Zend Framework的快速入門,它在Application_Model_GuestbookMapper中的fetchAll()中也遍歷$ resultSet,將這些值映射到一個新的Application_Model_Guestbook。這不是最佳實踐,是否有更深入的ZF中的映射器和域圖層資源,您可以推薦? – Craig 2010-11-18 23:16:17

+0

Fge發佈的鏈接應該覆蓋映射器部分。我只是說模型取決於所使用的讀取機制,會自動創建一個填充模型對象。 – 2010-11-19 22:17:13

+0

我不是100%確定的,但我相信你必須擴展Zend_Db_Table_Row_Abstract才能使用類作爲$ _rowClass?這意味着該模型會獲得底層數據庫模式的知識,這是數據映射器模式試圖避免的。但是,當然,您必須權衡這一點,以反覆遍歷結果集來創建模型對象... – 2011-11-03 20:34:30