2008-10-09 82 views
2

如果我有一個類表示在我的數據庫中以類:表關係訪問一個表,那麼我可以在一個類中隱藏表的詳細信息。但作爲任何有用的應用程序,我必須查詢幾個表。我怎樣才能適應這個使用類:表設計?使用Zend框架的MVC數據設計問題

+0

你是什麼意思「但作爲任何有用的應用程序,我必須查詢幾個表。」 – Dinoboff 2008-10-09 10:09:08

回答

2

有幾種不同的方式可以實現這一點,但是,您選擇哪一種方式取決於您的情況。

1)打破你的目標和你的數據庫

之間的連接寫下您的對象與數據庫中的表沒有任何關係。首先規範你的數據庫表,然後,看看你的應用程序的用戶將如何與你的數據進行交互。將數據建模爲對象,但不要將每個對象綁定到表(即使用Zend_DB_Table_Abstract類)

一旦建立了對象,然後編寫映射器類,將映射對象映射回數據庫中的相關表。這些是擴展Zend_DB_Table的類(如果適用)。

您可以通過兩種方式處理連接,或者通過Zend_DB_Table關係functionallity來映射連接,或者((恕我直言,更好的選擇))只是使用Zend_DB_Select在您的映射器類中創建相關方法。

所以,你再有兩班(大概每桌,但不總是)

人 PersonMapper

在你的代碼中,當你想與一些對象的工作,無論是創建新的對象

$person = new Person(); 
$person->setName('andrew taylor'); 

然後寫它傳遞給映射器保存:

$personMapper = new PersonMapper(); 
$pesonnMapper->save($person); 

或者說,它的其他方式:

$personMapper = new PersonMapper(); 
$person = personMapper->load(29); 

$person->setName('joe bloggs'); 
$personMapper->save($person); 

從這裏的下一步將是基於該SPL集合類:

$personList = $personMapper->loadAllMen(); 

foreach($personList AS $person) { 

echo $person->getName(); 
} 

其中$ personMapper-> loadAllMen()是方法等:

$select = $this->select(); 
$select=>where('gender = "Male"'); 
$zendDbRows = this->fetchAll($select); 

return new PersonList($zendDbRows); 

2)的MySQL視圖

如果你有很多連接的表,每個連接有一行,所以你根據你的訂單表中的id加入客戶信息,並且你只是以只讀方式進行操作(所以你不想更新通過Zend_DB_Table適配器提供的任何信息),您可以創建規範化的表格,然後創建頂部的單個視圖。視圖通過Zend來處理幕後的連接,就像你連接到一個表一樣。

這裏有一些注意事項,MySQL視圖確實有一些性能問題(這就是爲什麼它最好在單行FK連接上),而且它們是嚴格只讀的。