Содержание


ResultSet


ResultSet, ЗФ2, Zend Framework 2, ZF2




Zend\Db\ResultSet дополнительным компонентом  Zend\Db, который абстрагирует итерацию (перебор) строк, созданных запросом (querу). Источником данных для этого может быть все, что угодно, что может быть итерируемо (можно перебирать), но обычно используется основной объект Zend\Db\Adpater\Driver\ResultInterface, как источник для получения данных. 

 

Zend\Db\ResultSetдолжен реализовать Zend\Db\ResultSet\ResultSetInterface и все дополнительные компоненты Zend\Db, возвращающие ResultSet как часть своего  API, реализующего  ResultSetInterface. В большинстве случаев паттерн Prototype используется  для клонирования множественных прототипов объекта ResultSet и возвраения специализированного ResultSet с уже инъекцированными нужными данными.  Интерфейс ResultSetInterface выглядит так:

interface ResultSetInterface extends \Traversable, \Countable
{
    public function initialize($dataSource);
    public function getFieldCount();
}


Быстрый старт

 

Zend\Db\ResultSet\ResultSet является основной формой (представлением) объекта ResultSet, который будет предоставлять каждую строку как объект ArrayObject или массив.По-умолчанию, ZendDbAdapterAdapter использует Zend\Db\ResultSet\ResultSet для итерации строк при вызове метода Zend\Db\Adapter\Adapter::query().

 

Ниже приведен пример, который имитирует логику работы Zend\Db\Adapter\Adapter::query():

use Zend\Db\Adapter\Driver\ResultInterface;
use Zend\Db\ResultSet\ResultSet;
 
$stmt = $driver->createStatement('SELECT * FROM users');
$stmt->prepare($parameters);
$result = $stmt->execute();
 
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 или его производное  - Zend\Db\ResultSet\AbstractResultSet, которое представляет следующие функциональные возможности:

 

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\DbResultSet\HydratingResultSet

 

Более гибким объектом ResultSetявляется Zend\Db\ResultSet\HydratingResultSet, который позволяет разработчику возможность выбора системы гидратации (hydration strategy) для получения строки данных в нужный объект. В процессе итерации, HydratingResultSet берет прототип целевого объекта и копирует  его в каждую успешно созданную новую строку. К каждой ново клонированной строке HydratingResultSet присоединяет (гидратирует, hydrate) целевой объект к строке данных.

 

В следующем примере итерируются (перебираются) строки из БД. В течении этого процесса HydratingRowSet использует отражение (Reflection), основанное на гидратации (присоединении) для инъекцирования строк данных непосредственно в защищенные члены клонированного объекта UserEntity:

use Zend\Db\Adapter\Driver\ResultInterface;
use Zend\Db\ResultSet\HydratingResultSet;
use Zend\Stdlib\HydratorReflection as ReflectionHydrator;
 
class UserEntity {
    protected $first_name;
    protected $last_name;
    public function getFirstName() { return $this->first_name; }
    public function getLastName() { return $this->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;
    }
}

Для более полного понимания обратите свое внимание на раздел документации, описывающий Zend\Stdlib\Hydrator.



Автор статьи: DuB