2017-05-09 20 views
0

私のmongodbデータベースに対してクエリを実行しています...そして、フロントエンドロジックの2つの別々の場所で、結果を繰り返して別の情報を抽出/表示する必要があります。mongodbカーソルを2回反復しようとしています - 失敗しました

問題

私は反復処理しようとする第二の時間、私は、次のエラーメッセージが出ます:

Fatal error: Uncaught MongoDB\Driver\Exception\LogicException: Cursors cannot yield multiple iterators in /var/www/localhost/htdocs/widgets/exception_details.php:46 Stack trace: #0

バックエンドのコード

をここでデータベースを照会するためのロジックです私のモデル:

try{ 
     $id = new \MongoDB\BSON\ObjectId($docid); 
     $filter = ['_id' => $id]; 
     $options = []; 
     $query = new \MongoDB\Driver\Query($filter, $options); 
     $rows = $m->executeQuery('widgets.play_summary', $query); 
     return $rows; 
    } catch (Exception $e) { 
     echo 'Exception:'. $e->getMessage(); 
     return false; 
    } 

フロントエンドロジック

ここでは、反復を試みるロジックがあります。

初回:その後、

foreach ($rows as $id=>$value) { 
     if (count($value->unreachable_servers > 0)) { 
      foreach($value->unreachable_servers as $key=>$value) { 
       echo "<tr>"; 
       echo "<td>$value</td>"; 
       echo "</tr>"; 
      } 
     } 
} 

以降、私はこれをしようと、次の行をコメントアウト

$it = new IteratorIterator($rows); //line 46 
$it->rewind(); 
foreach ($rows as $id=>$value) { 
    if (count($value->failed_plays > 0)) { 
      foreach($value->failed_plays as $key=>$value) { 
        echo "<tr>"; 
        echo "<td>$value</td>"; 
        echo "</tr>"; 
      } 
    } 
} 

追加情報

だけで正確に同じエラーを与えるが、ライン46の代わりにライン48に:

$it = new IteratorIterator($rows); 
$it->rewind(); 

ヒントをいただければ幸いです。

ありがとうございました。試験として

EDIT 1

、Iは、巻き戻しを使用するフロントエンド・コードを変更し、次のような:

$it = new \IteratorIterator($rows); 
$it->rewind(); 
//foreach ($rows as $id=>$value) { 
while($value = $it->current()) { 
     if (count($value->unreachable_servers > 0)) { 
      foreach($value->unreachable_servers as $key=>$value) { 
       echo "<tr>"; 
       echo "<td>$value</td>"; 
       echo "</tr>"; 
      } 
     } 
    $it->next(); 
} 

そして第二のループのために:

$it = new IteratorIterator($rows); 
$it->rewind(); 
//foreach ($rows as $id=>$value) { 
while($value = $it->current()) { 
    if (count($value->failed_plays > 0)) { 
      foreach($value->failed_plays as $key=>$value) { 
        echo "<tr>"; 
        echo "<td>$value</td>"; 
        echo "</tr>"; 
      } 
    } 
    $it->next(); 
} 

私は同じ結果を得る。それは最初に動作しますが、同じエラーメッセージで2回目に爆撃します。

答えて

0

カーソルを2回反復することはできません。メモリに収まる場合は配列にフェッチします。

$rows = $m->executeQuery('widgets.play_summary', $query); 
    return $rows->toArray(); 
+0

なぜそれらが巻き戻しの方法を提供しますか?私はあなたの答えを今すぐ試しています...しかし、ちょうど私が尋ねると思った。 – dot

+1

** ** **?イテレータでカーソルをラップしようとしているのはあなたです。 –

+0

ええと...ドキュメントを見れば、巻き戻しメソッドが明示的に参照されます。 http://php.net/manual/en/class.mongodb-driver-cursor.php – dot

関連する問題