Zend\Db\ResultSet 是 Zend\Db 的一个子组件,用来抽象化行集产生查询的迭代。虽然数据源可以是任何可迭代的东西,通常 Zend\Db\Adapter\Driver\ResultInterface 为基础的对象是检索数据的主要来源。
Zend\Db\ResultSet 必须实现 Zend\Db\ResultSet\ResultSetInterface,Zend\Db 所有返回 ResultSet 的子组件将假定一个 ResultSetInterface 的实例应被返回。大多数情况下,原型模式用于消费对象以克隆 ResultSet 的原型并返回指定的注入了特定数据源的 ResultSet。
1 2 3 4 5 |
interface ResultSetInterface extends \Traversable, \Countable { public function initialize($dataSource); public function getFieldCount(); } |
快速入门(Quickstart)
Zend\Db\ResultSet\ResultSet 是 ResultSet 对象最基本的形式,它将把每一行数据作为显示类似 ArrayObject 对象或数组显示出。默认情况下,使用 Zend\Db\Adapter\Adapter::query()方法时,Zend\Db\Adapter\Adapter 将使用原型的 Zend\Db\ResultSet\ResultSet 对象来迭代。
以下是一个示例工作流程,你会在 Zend\Db\Adapter\Adapter::query() 找到类似内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use Zend\Db\Adapter\Driver\ResultInterface; use Zend\Db\ResultSet\ResultSet; $stmt = $driver->createStatement('SELECT * FROM users'); $stmt->prepare(); $result = $stmt->execute($parameters); if ($result instanceof ResultInterface && $result->isQueryResult()) { $resultSet = new ResultSet; $resultSet->initialize($result); foreach ($resultSet as $row) { echo $row->my_column . PHP_EOL; } } |
Zend\Db\ResultSet\ResultSet 和 Zend\Db\ResultSet\AbstractResultSet(Zend\Db\ResultSet\ResultSet and Zend\Db\ResultSet\AbstractResultSet)
大多数情况下,Zend\Db\ResultSet 的实例或 Zend\Db\ResultSet\AbstractResultSet 的派生将被使用。AbstractResultSet 的实现提供了以下核心方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
abstract class AbstractResultSet implements Iterator, ResultSetInterface { public function initialize($dataSource) public function getDataSource() public function getFieldCount() /** Iterator */ public function next() public function key() public function current() public function valid() public function rewind() /** countable */ public function count() /** get rows as array */ public function toArray() } |
Zend\Db\ResultSet\HydratingResultSet
Zend\Db\ResultSet\HydratingResultSet 是一个更具灵活性的 ResultSet 对象,允许开发者选择一个合适的“水化策略”将行数据送入目标对象中。迭代结果的同时,HydratingResultSet 将取出目标对象的原型,并对其进行克隆。然后 HydratingResultSet 将使用行数据水化克隆。
下面的示例,来自数据库的数据行将被迭代,在迭代期间,HydratingRowSet 将使用反射为基础的水化器将行数据直接注入到已克隆的 UserEntity 对象的 protected 成员变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
use Zend\Db\Adapter\Driver\ResultInterface; use Zend\Db\ResultSet\HydratingResultSet; use Zend\Stdlib\Hydrator\Reflection as ReflectionHydrator; class UserEntity { protected $first_name; protected $last_name; public function getFirstName() { return $this->first_name; } public function getLastName() { return $this->last_name; } public function setFirstName($first_name) { $this->first_name = $first_name; } public function setLastName($last_name) { $this->last_name = $last_name; } } $stmt = $driver->createStatement($sql); $stmt->prepare($parameters); $result = $stmt->execute(); if ($result instanceof ResultInterface && $result->isQueryResult()) { $resultSet = new HydratingResultSet(new ReflectionHydrator, new UserEntity); $resultSet->initialize($result); foreach ($resultSet as $user) { echo $user->getFirstName() . ' ' . $user->getLastName() . PHP_EOL; } } |