Где объекты 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()
). Это вернет массив массивов, где каждый массив является строкой в таблице БД.
Надеюсь, это поможет, обратная связь будет оценена:),
Стоян.