美文网首页程序员
ZendFramework3数据库操作zend-db

ZendFramework3数据库操作zend-db

作者: Vett | 来源:发表于2017-06-08 15:15 被阅读0次

    一. zend-db(2.8^)介绍

    zend-dbZendFramework3的数据库操作模块,支持常见的数据库.官方文档对其的介绍很粗略,没有详细介绍其子句,链式操作.文本将做部分补全.并简单介绍一个开源程序,对zend-db的操作进行简化.

    1. Zend\Db\Sql\Sql(以下简称Sql)

    Sql是zend-db的核心,封装了INSERT,DELETE,UPDATE,SELECT这四种常见的DML语句.
    以下主要以SELECT语句为例,介绍Sql如何生成并执行数据库操作:

    1.1 SELECT

    $adapter = new \Zend\Db\Adapter\Adapter([
        'driver'    => 'Pdo_Mysql',
        'dsn'       => 'mysql:host=localhost;dbname=test',
        'username'  => '/*username*/',
        'password'  => '/*password*/'
    ]);
    
    $sql = new \Zend\Db\Sql\Sql($adapter, '/*tablename*/');
    
    $select = $sql->select()->where(['Id' => '3']);
    $result = $sql->prepareStatementForSqlObject($select)->execute();
    
    

    WHERE子句如果需要复杂操作推荐使用闭包,如下例:

    $select = $sql->select()->where(function ($where) {
        $where->equalTo('age', '25');
        $where->or;
        $where->equalTo('age', '20');
    });
    

    上面的例子中,在生成$select的时候zend-db是支持链式操作的,例如:

    $select =   $sql->select()
                    ->where([/**/])
                    ->join('table2', 'table1.name = table2.name')
                    ->limit(10)
                    ->offset(30);
    

    如果想使用ResultSet来封装得到的数据,就要额外配置ResultSet.假设有数据对象User类,想要得到的数据全部用User类封装好,如下例:

    $resultSet = new \Zend\Db\ResultSet\HydratorResultSet(
        new \Zend\Hydrator\Reflection,
        new User
    );
    
    $hydrator = $resultSet->initialize($result);
    

    进而用foreach输出.

    2. Zend\Db\TableGateway\TableGateway(以下简称TableGateway)

    TableGateway是zend-db进一步对上述Sql的封装,可以更加方便的操作数据库,如下:

    $tableGateway = new \Zend\Db\TableGateway\TableGateway(
        /*table*/,
        $adapter
    );
    
    $result = $tableGateway->select(function ($where) { $where->equalTo('Id', '3'); });
    //或
    $result = $tableGateway->select(['Id' => '3']);
    

    如果需要join等操作,则需要$select = $tableGateway->getSql()->select();得到$select后参照上节的操作.

    如果需要封装返回数据,则需要如下操作:

    $resultSet = new \Zend\Db\ResultSet\HydratorResultSet(
        new \Zend\Hydrator\Reflection,
        new User
    );
    
    $tableGateway = new \Zend\Db\TableGateway\TableGateway(
        /*table*/,
        $adapter,
        null,
        $resultSet
    );
    /*...*/
    

    二. schu-database对zend-db的改进

    1. 快速生成TableGateway

    schu-database在写好配置文件后,所有的TableGateway可以通过如下方式获取:

    $tableGateway = $TableGatewayContainer->get('table_name');
    

    2. 便捷分页

    zend-db在处理分页的问题上需要额外配置一个模块zend-paginator(支持各种形式的数据源,支持缓存,换页导航预设等),但是简单的数据库分页zend-db并没有提供.只能用zend-db生成$select,然后在zend-paginator中执行此实例.在schu-database中:

    $paginator = $TableGateway->startSelect()->getPaginatorResultSet(3, 10);
    

    3. 更加直观的链式操作

    schu-database中允许zend-db中的操作外,还可以进行如下操作:

    $resultSet = $tableGateway->startSelect()
                              ->where(/***/)
                              ->join(/***/)
                              ->order(/***/)
                              ->limit(/***/)
                              ->offset(/***/)
                              ->execute();
    

    关于schu-database的更多信息,请访问本人博客,或GitHub.

    相关文章

      网友评论

        本文标题:ZendFramework3数据库操作zend-db

        本文链接:https://www.haomeiwen.com/subject/rkqtqxtx.html