Zend Framework 2 中的数据库访问

Posted

技术标签:

【中文标题】Zend Framework 2 中的数据库访问【英文标题】:Database access in Zend Framework 2 【发布时间】:2012-11-23 22:45:12 【问题描述】:

我想找到一种从 ZF2 访问我的数据库的好方法。我不想从我的模型或控制器中执行此操作,也不想使用任何 ORM 工具,例如 Doctrine(除非有人很好地说服了我!)。

tutorial application 正在使用表数据网关模式;它创建了一个类AlbumTable,它访问数据库中的album 表。我担心这种方法,因为我将制作一个规范化的数据库,我需要在其中加入几个表来表示一些模型。据我了解,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 关系。但是,如果我不需要加入,那么使用表数据网关肯定可以让我免于编写一堆代码。

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

提前谢谢你!

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的提示!我稍微修改了AbstractDbMapper 类并做了一个sample implementation。它工作正常,但如果您能花一点时间看看这是否是您的意思(以及您是否有任何改进),我将不胜感激。谢谢。 是的,我就是这个意思。我会考虑直接在 UserMapper 中实例化 hydrator,因为它与 User 实体对象的实现相关联,并且您不能在不更改 User 实现的情况下轻松交换。

以上是关于Zend Framework 2 中的数据库访问的主要内容,如果未能解决你的问题,请参考以下文章

如何在Zend Framework 2中访问路由,发布,获取等参数

如何在 Zend Framework 2 中为局部使用共享视图脚本路径?

如何使 Zend Framework 2 与 nginx 一起工作?

Zend Framework 中的动态菜单

markdown Zend Framework 3:RBAC的访问过滤器和访问视图助手

存储过程zend framework 2.2 tablegateway中的多选问题