2011-07-15 10 views
0

私はsymfonyプロジェクトでDoctrine 1.2を使用しています。Doctrine_Queryから反復する

私はdoctrineを繰り返したいのですが、私はDoctrine_Queryオブジェクトを持っています。私は100Kレコードを持つことができ、メモリ不足を望んでいないので、このクエリの "結果セット"を反復したいと思います。以下のような

何か:私はカスタムハイドレーターを使って、どのようにTODOを考え出し

$it = $query->iterate(); 
while($it->next()) { 
    $obj = $it->getOjbect(); 
    //Do some stuff with this object 
} 

。 ProjectConfiguration.class.phpファイルでsymfonyプロジェクトのために

、:コントローラで

public function configureDoctrine(Doctrine_Manager $manager) 
{ 
    $manager->registerHydrator('my_hydrator', 'Doctrine_Hydrator_MyHydrator'); 
} 

$this->filename = $query->execute(array(), 'my_hydrator'); 

Added in lib folder : 

class Doctrine_Hydrator_MyHydrator extends Doctrine_Hydrator_Abstract 
{ 
    public function hydrateResultSet($stmt) 
    { 
     $filename = sfConfig::get('sf_data_dir').'/'.time().'.csv'; 
     $fh = fopen($filename,'w'); 
     while($f = $stmt->fetch(Doctrine_Core::FETCH_BOTH)){ 
     $f = array(
      $f[0], 
      $f[1], 
      $f[2], 
      $f[3], 
      $f[4], 
      $f[5], 
      $f[6], 
      $f[7], 
      $f[8], 
     ); 
     fputcsv($fh, $f); 
     } 
     fclose($fh); 
     return $filename; 
    } 

答えて

0

あなたがメモリ不足を懸念している場合は、あなたが帰国になりますオブジェクトの代わりに配列としての結果

これはもちろん、あなたが、その後100Kレコードについて、あなたはおそらくとにかく

を必要としないはずのオブジェクト(あなたがしないでくださいます$ row->(保存することができます))、その結果を使用することはできません意味 documentationから

$q = Doctrine_Query::create() 
->select('u.id, u.username, p.phonenumber') 
->from('User u') 
->leftJoin('u.Phonenumbers p'); 

$results = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY); 
+0

Iは、各行が各オブジェクトの1から10までの特性から含まれているCSVファイルを作成する必要があります。 $結果には100Kまでの配列が含まれていますので、メモリが足りなくなります。私はexecute()を使うことはできません。 – Julien

+0

あなたは100kを返すために*必要なのですか?結果を改ページしましたか? – adlawson

+0

お返事ありがとうございます。はい、ページネーション(sfDoctrinePager)が解決策になる可能性があります。しかし、その前に私はそれが可能かどうかを確かめたい。$ ​​stmt = $ this-> maindb-> prepareStatement($ sql); $ stmt-> setInt(1、$ nid); $ rs = $ stmt-> executeQuery(); while($ rs-> next()){ ... } – Julien