あるシステムの改修をしています。
そのシステム内で検索結果をCSVに出力する機能があり、
以下の「取得したデータをループしてCSVのデータに設定する」ような処理が実装されています。
*** アクションクラス *** // SQL作る? $sql = Doctrine_Query::create()->from('test t'); $sql->addWhere('t.id = ?', $id); // 他条件追加したり // SQL発行して変数設定 $this->csvData = $sql->getQuery()->execute(); // 設定した変数はテンプレートphpで使用する
*** テンプレートphp *** <?php foreach($csvData as $dataObj): ?> <?php echo $dataObj->getId() ?> // ここでさらにループしたり <?php endforeach; ?>
*** SQLの結果の格納オブジェクト? *** class Product extends sfDoctrineRecord { // メインテーブル? public function setTableDefinition() { $this->setTableName('product'); $this->hasColumn('name', 'string', 255, array( 'type' => 'string', 'length' => '255', )); // 他複数のhasColumn } // 結合テーブルの設定? public function setMany() { $this->hasMany('hoge2', array( 'local' => 'mst_id', 'foreign' => 'id' )); // 他複数のhasMany } }
このCSV出力がとても遅く、改修する必要が出てきました。
調査したところ、DBからのデータ取得は問題なく、②のループ処理で極端に遅いことがわかりました。
3重ループほどしているのが原因だと思います。
そのためループせずに検索結果をCSVに出力するよう考えていますが、方法が中々見つかりません。
ループせずにCSVを出力する方法はありますでしょうか?