ZendFramework3数据库操作zend-db

一. 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)