Zend Framework 2中的数据库访问

时间:2012-11-23 22:45:13

标签: php orm zend-framework2

我想找到一个从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关系。但是,如果我不需要加入,那么使用表数据网关肯定会使我免于编写一堆代码。

所以,我想我的问题是,根据具体情况,两种方法的组合是否会很好?例如,如果我只需要访问一个表(不与其他表连接),那么我可以使用表数据网关,如果我需要连接几个表,我可以使用另一种方法。这是一个好主意还是坏主意?还有更好的选择吗?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

我将Mapper类与Entity对象一起使用。为了避免为简单的用例编写过多的重复代码,我使用ZfcBase的AbstractDbMapper来扩展我的特定映射器。