Этот результат представляет собой только результирующий набор только вперед, вызов rewind() после перемещения вперед не поддерживается - Zend
В приложении Zend я использую Zend\Db\TableGateway
и Zend\Db\Sql
для извлечения данных из базы данных MySQL, как показано ниже.
Модель -
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. Но он дает ошибку при попытке повторить два или более раз. Работает одиночная итерация.
Этот результат является прямым результирующим набором, вызывая rewind() после движение вперед не поддерживается
Я могу решить его, загрузив его в другой массив. Но это лучший способ? Есть ли другой способ справиться с этим?
$records = array();
foreach ($edu_qualifications as $result) {
$records[] = $result;
}
EDIT -
$resultSet->buffer();
решил проблему.
Ответы
Ответ 1
Вы получаете этот Exception
, потому что это ожидаемое поведение. Zend использует PDO, чтобы получить его Zend\Db\ResultSet\Resultset
, который возвращается Zend\Db\TableGateway\TableGateway
. Наборы результатов PDO по умолчанию используют курсор только для прямого перемещения, что означает, что вы можете выполнить цикл только через один раз.
Для получения дополнительной информации о курсорах отметьте Wikipedia и this статья.
Поскольку Zend\Db\ResultSet\Resultset
реализует PHP Iterator
, вы можете извлечь массив из набора, используя метод Zend\Db\ResultSet\Resultset:toArray()
или используя iterator_to_array()
. Будьте осторожны, хотя об использовании этой функции на потенциально больших наборах данных! Одна из лучших вещей о курсорах - это то, что они не позволяют вносить все за один раз, если набор данных слишком велик, поэтому бывают случаи, когда вы не захотите вносить все это в массив сразу.
Ответ 2
Конечно, похоже, что когда мы используем Mysql и хотим итерации $resultSet, эта ошибка произойдет, b/c Mysqli только делает
(см. этот пост: ZF2 DB Позиция результатов переадресована?)
Я тоже столкнулся с этой проблемой. Но если добавить следующую строку, она решила:
$resultSet->buffer();
но в этом упомянутом сообщении предлагается использовать следующую строку. Мне просто интересно, почему и какая разница:
$resultSet->getDataSource()->buffer();
Ответ 3
Это сработало для меня.
public function fetchAll()
{
$select = $this->tableGateway->getSql()->select();
$resultSet = $this->tableGateway->selectWith($select);
$resultSet->buffer();
$resultSet->next();
return $resultSet;
}
Ответ 4
$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();