我遇到了ZF2尝试使用表格网关并获取结果集的问题:
我正在尝试查询两个结果集(来自两个不同的表/两个不同的网关)并将它们发送到视图以进行迭代并放置在屏幕上。
(简化示例):
function viewAction() {
$table1 = $this->getServiceLocator()->get('Model\Table\Table1');
$table2 = $this->getServiceLocator()->get('Model\Table\Table2');
return new ViewModel([
'table1' => $table1->fetchAll(),
'table2' => $table2->fetchAll()
]);
}
使用Model \ Table \ Table1和Model \ Table \ Table2获取全部:
public function fetchAll() {
return $this->tableGateway->select();
}
然后在我看来:
...
<?php
foreach($table1 as $row) {
echo "<tr><td>{$row['col1']}</td><td>{$row['col2']}</td></tr>";
}
?>
...
<?php
foreach($table2 as $row) {
echo "<tr><td>{$row['col1']}</td><td>{$row['col2']}</td></tr>";
}
?>
...
问题是,$ table1在循环时没有数据。但是,如果我改为做这样的事情(在控制器中,而不是将结果集传递给视图,将$ results1和$ results2传递给视图):
$fetchAll = $table1->fetchAll();
$results1 = [];
foreach($fetchAll as $row) {
$results1[] = $row;
}
$fetchAll = $table2->fetchAll();
$results2 = [];
foreach($fetchAll as $row) {
$results2[] = $row;
}
然后一切正常。我不想两次遍历同一组数据。 那么为什么ZF2阻止我在访问ResultSet中的所有数据之前使用两个不同的ResultSet?
答案 0 :(得分:-1)
由于我一个接一个地查询不同的记录集,因此数据库仍在等待第一个查询上发生的操作。 我一次只能设置一个操作记录。
第一个解决方案是我在问题中提出的,获取记录集并循环遍历所有可用的行,然后再次尝试查询。这会释放记录集,因为我们拥有所有数据。
第二个解决方案(我已经改编的解决方案)是为数据库连接启用多个活动记录集(MARS)。
我能够通过将MARS_Connection=yes
添加到MSSQL的dsn连接字符串来实现此目的。