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

时间:2012-06-18 07:52:26

标签: 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();
    }           

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

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

我有什么问题吗?我可能已经忘记了?

1 个答案:

答案 0 :(得分:7)

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

但是,您可以通过修改tracking policy来更改原则确定对象已更改的方式。由于您正在使用大量对象,因此您可能需要更改为DEFERRED_EXPLICIT跟踪政策。使用此方法,您将专门调用:

$em->persist($object);

您想要更新的实体。您必须实现自己的逻辑来确定如果需要保留对象。