我在Symfony2 Controller上有关于$em->flush()
的问题。
$v = $em->getRepository("ApplicationAdminBundle:VehiculeCompute")->findAll();
foreach ($v as $vehicule) {
[...]
$somme = {"compute before"};
$veh = $em->getRepository("ApplicationAdminBundle:VehiculeCompute")->find($vehicule->getIdvehicules());
$veh->setTaxeadditionnelle($somme);
$em->flush();
$total++;
}
所以,要执行这个循环,我的脚本需要很长时间,因为我的桌面上有大约40,000个车辆。
我认为每个循环中$em->flush()
是不必要的......
$v = $em->getRepository("ApplicationAdminBundle:VehiculeCompute")->findAll();
$k = 0;
foreach ($v as $vehicule) {
[...]
$somme = {"compute before"};
$veh[$k] = $em->getRepository("ApplicationAdminBundle:VehiculeCompute")->find($vehicule->getIdvehicules());
$veh[$k]->setTaxeadditionnelle($somme);
$total++;
}
$em->flush(); // Flush all of vehicule update ?!
unset($veh);
这个版本可以用吗? 感谢。
答案 0 :(得分:1)
不是使用实体管理器对大量数据执行相同的操作,而是建议处理查询构建器更新,如
$em
->getRepository('Foo')
->createQueryBuilder()
->update()
->field('bar')->set('value')
->getQuery()
->execute();
在大型阵列上使用flush()时要小心。我在使用这个问题时遇到了一些问题,通过使用array_chunk和刷新100个或更少的项来解决这个问题
答案 1 :(得分:0)
相反,你可以一次冲洗20次,如下所示。这样做的速度要快得多。
$v = $em->getRepository("ApplicationAdminBundle:VehiculeCompute")->findAll();
$index = 0;
foreach ($v as $vehicule) {
[...]
$somme = {"compute before"};
$veh = $em->getRepository("ApplicationAdminBundle:VehiculeCompute")->
find($vehicule->getIdvehicules());
$veh->setTaxeadditionnelle($somme);
$em->persist($veh);
if($index%20==0)
$em->flush();
$index++;
}
$em->flush();
答案 2 :(得分:0)
$em->flush()
和$veh[]
数组中的每个实体,ALL ALL OK!