一. zend-db(2.8^)介绍
zend-db
是ZendFramework3
的数据库操作模块,支持常见的数据库.官方文档对其的介绍很粗略,没有详细介绍其子句,链式操作.文本将做部分补全.并简单介绍一个开源程序,对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();