Symfony2 flush()实体

时间:2014-08-29 08:45:44

标签: php symfony flush entities

我在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);

这个版本可以用吗? 感谢。

3 个答案:

答案 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!