在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;
}
编辑 -
$resultSet->buffer();
解决了这个问题。
答案 0 :(得分:13)
您收到此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()
函数提取集合的数组。关于在潜在的大型数据集上使用此功能,请务必小心!关于游标最好的事情之一就是它们避免一次性引入所有内容,以防数据集太大,所以有时候你不想一次将它全部放入数组中。
答案 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();