2012-11-23 87 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