13

在 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 并在视图中回显。但是当尝试回显两次或更多次时会出错。单次迭代有效。

这个结果是只向前的结果集,不支持向前移动后调用rewind()

我可以通过将其加载到视图中的另一个数组来解决它。但这是最好的方法吗?有没有其他方法来处理这个?

$records = array();
foreach ($edu_qualifications as $result) {
    $records[] = $result;
}

编辑 -

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

4

4 回答 4

14

您收到此Exception消息是因为这是预期的行为。Zend 使用PDO来获取它Zend\Db\ResultSet\Resultset的返回值Zend\Db\TableGateway\TableGateway。PDO 结果集默认使用只进游标,这意味着您只能循环遍历该集一次。

有关游标的更多信息,请查看Wikipedia本文

作为Zend\Db\ResultSet\ResultsetPHP 的实现,您可以使用方法或函数Iterator提取集合的数组。在潜在的大型数据集上使用此函数时要小心!游标的最大优点之一就是它们避免一次性带入所有内容,以防数据集太大,因此有时您不想一次将所有内容都放入数组中。Zend\Db\ResultSet\Resultset:toArray()iterator_to_array()

于 2013-09-02T11:52:04.233 回答
8

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

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

$resultSet->buffer();

但在这个提到的帖子中,它建议使用以下行。我只是想知道为什么,它们有什么区别:

$resultSet->getDataSource()->buffer(); 
于 2013-11-20T12:13:20.510 回答
0

这对我有用。

public function fetchAll()
    {

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

        return $resultSet;
    }
于 2014-02-11T00:46:04.567 回答
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();
于 2016-01-07T18:28:37.637 回答