从Doctrine_Query迭代

时间:2011-07-15 20:32:29

标签: symfony1 doctrine loops

我在symfony项目中使用Doctrine 1.2。

我想用doctrine进行迭代,我有一个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;
    }

1 个答案:

答案 0 :(得分:0)

如果你担心内存不足,你应该考虑将结果作为数组而不是对象返回。

这当然意味着你不能再将结果用作对象(所以你不能做$ row-> save()),对于100k记录,你可能根本不需要

来自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);
相关问题