1

テーブル ゲートウェイを使用して結果セットを取得しようとしている ZF2 に問題があります。

(2 つの異なるテーブル/2 つの異なるゲートウェイから) 2 つの結果セットをクエリし、それらをビューに送信して反復処理し、画面に配置しようとしています。

(簡略化した例):

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;
}

その後、すべて正常に動作します。同じデータ セットを 2 回ループする必要はありません。 では、ZF2 では、ResultSet 内のすべてのデータにアクセスする前に 2 つの異なる ResultSet を使用できないのはなぜでしょうか?

4

1 に答える 1

-1

異なるレコード セットに対して次々とクエリを実行していたため、データベースはまだ最初のクエリでアクションが実行されるのを待っていました。 一度に設定できるアクション レコードは 1 つだけでした。

最初の解決策は、質問で提示したものでした。レコードセットを取得し、使用可能なすべての行をループしてから、再度クエリを実行します。これにより、すべてのデータがあるため、レコード セットが解放されます。

2 番目の解決策 (私が採用したもの)は、データベース接続に対して複数のアクティブ レコード セット (MARS)を有効にすることです。

MARS_Connection=yesMSSQL の dsn 接続文字列に追加することで、これを行うことができました 。

于 2013-08-23T13:09:50.583 に答える