2012-11-23 85 views
1

我想找到一個從ZF2訪問我的數據庫的好方法。我不想從我的模型或控制器做到這一點,我不想使用任何ORM工具,如學說(除非有人說服我做得很好!)。Zend Framework中的數據庫訪問2

tutorial application正在使用Table Data Gateway模式;它會創建一個訪問數據庫中的album表的類AlbumTable。我很關心這種方法,因爲我將製作一個規範化的數據庫,我需要連接多個表來表示某些模型。據我所知,這不能用TableGateway類來完成。當然,你可以做$tblgateway->getSql()並從那裏開始,但是這種做法違背了我認爲的表格數據網關模式的目的。

所以,我把我的注意力轉向Zend\Db\Sql\Sql。在專輯例子的基礎上,我得到了以下工作:

class AlbumMapper { 
    private $sql; 

    public function __construct(Sql $sql) { 
     $this->sql = $sql; 
    } 

    public function getAlbum($id) { 
     $id = (int) $id; 

     $select = $this->sql->select(); 
     $select->from('album'); 
     $select->where(array('id' => $id)); 

     $statement = $this->sql->prepareStatementForSqlObject($select); 
     $result = $statement->execute(); 
     $row = $result->current(); 

     $album = null; 

     if ($row) { 
      $album = new Album(); 

      $album->setTitle($row['title']); 
      $album->setArtist($row['artist']); 
      $album->setId($row['id']); 
     } 

     return $album; 
    } 
} 

這裏的關鍵是,我可以打電話給$select->join()並加入多個表,這會給我查詢我的數據庫的更多的控制和去除1:1的關係在我的模型和桌子之間。但是,如果我不需要加入,那麼使用Table Data Gateway肯定會使我無法編寫一堆代碼。

所以,我想我的問題是,如果這兩種方法的組合會取決於情況會不錯?例如,如果我只需要訪問一個表(不加入其他表),那麼我可以使用Table Data Gateway,如果我需要連接幾個表,我可以使用其他方法。這是個好主意還是壞主意?有沒有更好的選擇?

預先感謝您!

回答

2

我使用帶有Entity對象的Mapper類。爲了避免爲簡單用例編寫太多重複代碼,我使用ZfcBase的AbstractDbMapper來擴展我的特定映射器。

+0

感謝您的提示!我稍微修改了'AbstractDbMapper'類並做了一個[示例實現](http://pastebin.com/dqPfnsGA)。它工作正常,但如果你想花一點時間看看這是否是你的意思(如果你有任何改進),我將不勝感激。謝謝。 – Andy0708

+0

是的,這就是我的意思。我會考慮直接在UserMapper中實例化Hydrator,因爲它與User實體對象的實現綁定在一起,並且不會在不更改User的實現的情況下輕鬆進行交換。 –

+0

好點 - 非常感謝。 – Andy0708