2011-07-15 48 views
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; 
    } 

回答

0

如果你擔心運行內存,你應該考慮回國結果作爲數組而不是對象。

當然,這將意味着你不能再使用結果作爲對象(所以你不能做$按行>保存()),這對於10萬點的記錄,你可能不應該需要反正

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

我將必須創建一個csv文件,其中每一行從每個對象的1至10的屬性包含。 $結果可以包含高達100K的數組,所以我將耗盡內存。我不能使用execute()。 – Julien

+0

你*需要*返回100k嗎?你看過分頁結果嗎? – adlawson

+0

謝謝你的回覆。是的分頁(sfDoctrinePager)可能是一個解決方案。但在此之前,我想確定是否可以執行如下操作:$ stmt = $ this-> maindb-> prepareStatement($ sql); $ stmt-> setInt(1,$ nid); $ rs = $ stmt-> executeQuery(); while($ rs-> next()){ ... } – Julien