0
我在symfony項目中使用Doctrine 1.2。從Doctrine_Query迭代
我想迭代的教條,我有一個Doctrine_Query對象,我想迭代這個查詢的「結果集」,因爲我可以有100K記錄,並不想用盡內存。
喜歡的東西:
$it = $query->iterate();
while($it->next()) {
$obj = $it->getOjbect();
//Do some stuff with this object
}
我通過使用自定義水化想出如何待辦事項。
對於symfony項目,在ProjectConfiguration.class.php:
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;
}
我將必須創建一個csv文件,其中每一行從每個對象的1至10的屬性包含。 $結果可以包含高達100K的數組,所以我將耗盡內存。我不能使用execute()。 – Julien
你*需要*返回100k嗎?你看過分頁結果嗎? – adlawson
謝謝你的回覆。是的分頁(sfDoctrinePager)可能是一個解決方案。但在此之前,我想確定是否可以執行如下操作:$ stmt = $ this-> maindb-> prepareStatement($ sql); $ stmt-> setInt(1,$ nid); $ rs = $ stmt-> executeQuery(); while($ rs-> next()){ ... } – Julien