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;
}
Iは、各行が各オブジェクトの1から10までの特性から含まれているCSVファイルを作成する必要があります。 $結果には100Kまでの配列が含まれていますので、メモリが足りなくなります。私はexecute()を使うことはできません。 – Julien
あなたは100kを返すために*必要なのですか?結果を改ページしましたか? – adlawson
お返事ありがとうございます。はい、ページネーション(sfDoctrinePager)が解決策になる可能性があります。しかし、その前に私はそれが可能かどうかを確かめたい。$ stmt = $ this-> maindb-> prepareStatement($ sql); $ stmt-> setInt(1、$ nid); $ rs = $ stmt-> executeQuery(); while($ rs-> next()){ ... } – Julien