В приложении Zend я использую Zend\Db\TableGateway
и Zend\Db\Sql
для извлечения данных из базы данных MySQL, как Zend\Db\TableGateway
ниже.
Модель –
public function getCandidateEduQualifications($id) { $id = (int) $id; $rowset = $this->tableGateway->select(function (Sql\Select $select) use ($id) { $select->where ->AND->NEST->equalTo('candidate_id', $id) ->AND->equalTo('qualification_category', 'Educational'); }); return $rowset; }
Посмотреть –
Я просто перебираю $ rowset и echo. Но он дает ошибку при попытке повторить два или более раз. Работает единственная итерация.
Этот результат представляет собой только результирующий набор вперед, вызывающий перемотку () после перемещения вперед не поддерживается
Я могу решить его, загрузив его в другой массив. Но это лучший способ? Есть ли другой способ справиться с этим?
$records = array(); foreach ($edu_qualifications as $result) { $records[] = $result; }
РЕДАКТИРОВАТЬ –
$resultSet->buffer();
решил проблему.
Вы получаете это Exception
потому что это ожидаемое поведение. Zend использует PDO для получения Zend\Db\ResultSet\Resultset
который возвращается Zend\Db\TableGateway\TableGateway
. Наборы результатов PDO по умолчанию используют курсор только для прямого ввода, что означает, что вы можете только прокручивать набор один раз.
Для получения дополнительной информации о курсорах проверьте Википедию и эту статью.
Поскольку Zend\Db\ResultSet\Resultset
реализует Iterator
PHP, вы можете извлечь массив из набора, используя метод Zend\Db\ResultSet\Resultset:toArray()
или используя функцию iterator_to_array()
. Будьте осторожны, хотя об использовании этой функции на потенциально больших наборах данных! Одна из лучших вещей о курсорах – это то, что они не позволяют вносить все за один раз, если набор данных слишком велик, поэтому бывают случаи, когда вы не захотите вносить все это в массив сразу.
Конечно, похоже, что когда мы используем Mysql и хотим итерации $ resultSet, эта ошибка будет иметь место, b / c Mysqli выполняет только форвардные результирующие наборы (см. Этот пост: ZF2 DB Позиция результата переадресована? )
Я тоже столкнулся с этой проблемой. Но добавив следующую строку, она решила:
$resultSet->buffer();
но в этом упомянутом сообщении предлагается использовать следующую строку. Мне просто интересно, почему, и в чем их отличие:
$resultSet->getDataSource()->buffer();
Это сработало для меня.
public function fetchAll() { $select = $this->tableGateway->getSql()->select(); $resultSet = $this->tableGateway->selectWith($select); $resultSet->buffer(); $resultSet->next(); return $resultSet; }
$sql = new Zend\Db\Sql($your_adapter); $select = $sql->select('your_table_name'); $statement = $sql->prepareStatementForSqlObject($select); $results = $statement->execute(); $resultSet = new ResultSet(); $resultSet->initialize($results); $result = $resultSet->toArray();