数据库操作 Zend\Db\ResultSet

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值