此结果是仅向前结果集,不支持在向前移动后调用rewind() - Zend

时间:2013-09-02 06:54:28

标签: php mysql zend-framework zend-framework2

在Zend应用程序中,我使用Zend\Db\TableGatewayZend\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;
}

编辑 -

$resultSet->buffer();解决了这个问题。

4 个答案:

答案 0 :(得分:13)

您收到此Exception,因为这是预期的行为。 Zend使用PDO获取由Zend\Db\ResultSet\Resultset返回的Zend\Db\TableGateway\TableGateway。默认情况下,PDO结果集使用仅向前游标,这意味着您只能遍历该集合一次。

有关游标的详细信息,请查看Wikipediathis文章。

Zend\Db\ResultSet\Resultset实现PHP Iterator时,您可以使用Zend\Db\ResultSet\Resultset:toArray()方法或使用iterator_to_array()函数提取集合的数组。关于在潜在的大型数据集上使用此功能,请务必小心!关于游标最好的事情之一就是它们避免一次性引入所有内容,以防数据集太大,所以有时候你不想一次将它全部放入数组中。

答案 1 :(得分:7)

当然,看起来当我们使用Mysql并想要迭代$ resultSet时,会发生这个错误,b / c Mysqli只做 前移结果集(参考这篇文章:ZF2 DB Result position forwarded?

我也遇到过这个问题。但是当添加以下行时,它解决了:

$resultSet->buffer();

但是在这篇文章中,它建议使用以下行。我只是想知道为什么,以及它们之间的区别:

$resultSet->getDataSource()->buffer(); 

答案 2 :(得分:0)

这对我有用。

public function fetchAll()
    {

        $select = $this->tableGateway->getSql()->select(); 
        $resultSet = $this->tableGateway->selectWith($select);
        $resultSet->buffer();
        $resultSet->next();

        return $resultSet;
    }

答案 3 :(得分:0)

$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();