我在一个巨大的集合(超过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无法检测更新的对象,因此只更新数据库中的那些对象?
我有什么问题吗?我可能已经忘记了?
答案 0 :(得分:7)
默认情况下,Doctrine将逐个属性地检测对托管对象的更改。如果没有更改属性,则不应对其执行更新查询。您可能想要检查表单是否无意中更改了任何内容。
但是,您可以通过修改tracking policy来更改原则确定对象已更改的方式。由于您正在使用大量对象,因此您可能需要更改为DEFERRED_EXPLICIT
跟踪政策。使用此方法,您将专门调用:
$em->persist($object);
您想要更新的实体。您必须实现自己的逻辑来确定如果需要保留对象。