我在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;
}
答案 0 :(得分:0)
如果你担心内存不足,你应该考虑将结果作为数组而不是对象返回。
这当然意味着你不能再将结果用作对象(所以你不能做$ 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);