1

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?

4

1 回答 1

-1

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

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

第二种解决方案(我采用的那个)是为数据库连接启用多个活动记录集 (MARS)

MARS_Connection=yes我可以通过添加到 MSSQL 的 dsn 连接字符串来做到这一点 。

于 2013-08-23T13:09:50.583 回答