我想找到一个从ZF2访问我的数据库的好方法。我不想从我的模特或控制器那里做这件事,我也不想使用任何ORM工具,比如Doctrine(除非有人能说服我好!)。
tutorial application正在使用表数据网关模式;它创建了一个类AlbumTable
,用于访问数据库中的album
表。我担心这种方法,因为我将建立一个规范化的数据库,我需要连接几个表来表示一些模型。据我所知,TableGateway
类无法做到这一点。当然,你可以做$tblgateway->getSql()
并从那里开始,但这种做法违背了我认为的Table Data Gateway模式的目的。
所以,我把注意力转向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关系。但是,如果我不需要加入,那么使用表数据网关肯定会使我免于编写一堆代码。
所以,我想我的问题是,根据具体情况,两种方法的组合是否会很好?例如,如果我只需要访问一个表(不与其他表连接),那么我可以使用表数据网关,如果我需要连接几个表,我可以使用另一种方法。这是一个好主意还是坏主意?还有更好的选择吗?
提前谢谢!
答案 0 :(得分:2)
我将Mapper类与Entity对象一起使用。为了避免为简单的用例编写过多的重复代码,我使用ZfcBase的AbstractDbMapper来扩展我的特定映射器。