我想找到一個從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,如果我需要連接幾個表,我可以使用其他方法。這是個好主意還是壞主意?有沒有更好的選擇?
預先感謝您!
感謝您的提示!我稍微修改了'AbstractDbMapper'類並做了一個[示例實現](http://pastebin.com/dqPfnsGA)。它工作正常,但如果你想花一點時間看看這是否是你的意思(如果你有任何改進),我將不勝感激。謝謝。 – Andy0708
是的,這就是我的意思。我會考慮直接在UserMapper中實例化Hydrator,因爲它與User實體對象的實現綁定在一起,並且不會在不更改User的實現的情況下輕鬆進行交換。 –
好點 - 非常感謝。 – Andy0708