Подтвердить что ты не робот

Этот результат представляет собой только результирующий набор только вперед, вызов 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(); решил проблему.

4b9b3361

Ответ 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();