我想找到一个从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