为什么doctrine更新了我表单中的每个对象?

i.a*_*iel 4 symfony doctrine-orm

我在一个巨大的集合(超过10k对象)上有一个很大的Symfony 2表单.由于简单的原因,我无法显示数千个对象的形式.我正在显示大约300个物体的形式.

我发现无法将集合过滤到表单中,因此执行以下操作:

    $bigSetOfObjects = array(
        'myObject' => $this
                ->getDoctrine()
                ->getRepository('MyObject')
                ->findBy(... )
    );

    $form = $this->createForm(new MyObjectForm(), $bigSetOfObjects);

    // And a little further
    if ($this->getRequest()->getMethod() == 'POST') {
        $form->bindRequest($this->getRequest());
        $this->getDoctrine()->getEntityManager()->flush();
    }           
Run Code Online (Sandbox Code Playgroud)

一切都很好.表单显示正确的值,更新也正常.数据已正确保存到数据库中.问题是Doctrine正在为每个对象执行一个更新语句,这意味着整个页面大约有300个SQL语句,导致性能问题.

我不明白的是,我只更新了表格中的几个值,而不是全部.那么为什么Doctrine无法检测更新的对象,因此只更新数据库中的那些对象?

有什么我做错了吗?我可能已经忘记了?

MDr*_*tte 7

默认情况下,Doctrine将逐个属性地检测对托管对象的更改.如果没有更改属性,则不应对其执行更新查询.您可能想要检查表单是否无意中更改了任何内容.

但是,您可以通过修改跟踪策略来更改原则确定对象已更改的方式.由于您正在处理大量对象,因此您可能希望更改为DEFERRED_EXPLICIT跟踪策略.使用此方法,您将特别调用:

$em->persist($object);
Run Code Online (Sandbox Code Playgroud)

在您要更新的实体上.您必须实现自己的逻辑来确定是否需要持久化对象.