4

我在一个庞大的集合(超过 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 不能检测到更新的对象,从而只更新数据库中的那些对象呢?

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

4

1 回答 1

7

默认情况下,Doctrine 将逐个属性地检测托管对象的更改。如果没有属性发生变化,那么它不应该为它执行更新查询。您可能需要检查表单是否不会无意中更改任何内容。

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

$em->persist($object);

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

于 2012-07-02T16:29:20.290 回答