Итерация из Doctrine_Query - PullRequest
       1

Итерация из Doctrine_Query

0 голосов
/ 16 июля 2011

Я использую Doctrine 1.2 в проекте Symfony.

Я бы хотел перебрать доктрину, у меня есть объект 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 голосов
/ 16 июля 2011

Если вы беспокоитесь о нехватке памяти, вам следует возвращать результаты в виде массивов, а не объектов.

Это, конечно, означает, что вы не сможете использовать результаты в качестве объектов (поэтомувы не можете сделать $ row-> save ()), что для 100k записей вам, вероятно, вообще не нужно

Из документации :

$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);
...