Где объекты Zend\Db\ResultSet\ResultSet хранят полученные данные?

В приложении Zend Framework, которое построено очень похоже на приложение для альбомов из учебного пособия по началу работы с ZF2, я использую объект ResultSet для передачи данных из модели через контроллер в представление (подробности см. В коде ниже).

Это прекрасно работает, но я не понимаю, где ResultSet Объект содержит данные. Я могу зациклить это, например, с foreach и получить строку данных в обход (или лучше модель объекта по объекту модели). Но когда я отлаживаю его в своей IDE или просто var_dump(...) Вроде бы пусто.

Как / где Zend\Db\ResultSet\ResultSet объект содержит данные, извлеченные из базы данных?

Соответствующие части кода:

Настройки модуля:

class Module implements ConfigProviderInterface, ServiceProviderInterface, AutoloaderProviderInterface {
...
    public function getServiceConfig() {
        try {
            return array (
                'factories' =>array(
                    ...
                    'SportTable' => function ($serviceManager) {
                        $tableGateway = $serviceManager->get('SportTableGateway');
                        $table = new SportTable($tableGateway);
                        return $table;
                    },
                    'SportTableGateway' => function ($serviceManager) {
                        $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter');
                        $resultSetPrototype = new ResultSet();
                        $resultSetPrototype->setArrayObjectPrototype(new Sport());
                        return new TableGateway('sports', $dbAdapter, null, $resultSetPrototype);
                    },
                    ...
                )
            );
        }
        ...
}

Модель (таблица):

class CourseTable {
        ...
    public function findAllByCityNameAndSportTitle($cityName, $sportTitle) {
        $select = new Select();
        $where = new Where();
        ...
        $resultSet = $this->tableGateway->selectWith($select);
        return $resultSet;
    }
    ...
}

Модель (картограф):

class Course implements ArraySerializableInterface {

    public $id;
    ...

    public function exchangeArray(array $data) {
        $this->id               = (isset($data['id'])) ? $data['id'] : null;
        ...
    }
    ...
}

контроллер:

class CatalogController extends AbstractActionController {
    ...
    public function listCoursesAction() {
        $cityName = $this->params()->fromRoute('city', null);
        $sportTitle = $this->params()->fromRoute('sport', null);
        return new ViewModel(array(
            'city' => $cityName,
            'sport' => $sportTitle,
            'courses' => $this->getCourseTable()->findAllByCityNameAndSportTitle($cityName, $sportTitle)
        ));
    }
    ...
}

Посмотреть:

<?php foreach ($courses as $course) : ?>
<div>
    <div>id: <?php echo $this->escapeHtml($course->id); ?></div>
    ...
</div>
<?php endforeach; ?>

1 ответ

Zend\Db\ResultSet\ResultSet или скорее Zend\Db\ResultSet\AbstractResultSet держит ответ на ваш вопрос. Этот объект имеет 10-12 методов, большинство из которых обеспечивают итеративную функциональность. Чтобы ответить на ваш вопрос Zend\Db\ResultSet\ResultSet содержит информацию, полученную из БД в своем dataSource параметр (Zend\Db\ResultSet\ResultSet::$dataSource).

Парадокс результатов, повторяемых и загружаемых foreach но не видел var_dump() может быть объяснено тем фактом, что возвращаемые результаты фактически хранятся в буфере.

Если вы хотите получить доступ к набору результатов, я предлагаю вам использовать Zend\Db\ResultSet\ResultSet::toArray() ($resultSet->toArray()). Это вернет массив массивов, где каждый массив является строкой в ​​таблице БД.

Надеюсь, это поможет, обратная связь будет оценена:),

Стоян.

Другие вопросы по тегам