如果不循环遍历第一个结果集,则无法查询第二个结果集

时间:2013-08-15 14:52:51

标签: zend-framework2

我遇到了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?

1 个答案:

答案 0 :(得分:-1)

由于我一个接一个地查询不同的记录集,因此数据库仍在等待第一个查询上发生的操作。 我一次只能设置一个操作记录。

第一个解决方案是我在问题中提出的,获取记录集并循环遍历所有可用的行,然后再次尝试查询。这会释放记录集,因为我们拥有所有数据。

第二个解决方案(我已经改编的解决方案)是为数据库连接启用多个活动记录集(MARS)

我能够通过将MARS_Connection=yes添加到MSSQL的dsn连接字符串来实现此目的。