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无法检测更新的对象,因此只更新数据库中的那些对象?
有什么我做错了吗?我可能已经忘记了?
默认情况下,Doctrine将逐个属性地检测对托管对象的更改.如果没有更改属性,则不应对其执行更新查询.您可能想要检查表单是否无意中更改了任何内容.
但是,您可以通过修改跟踪策略来更改原则确定对象已更改的方式.由于您正在处理大量对象,因此您可能希望更改为DEFERRED_EXPLICIT跟踪策略.使用此方法,您将特别调用:
$em->persist($object);
Run Code Online (Sandbox Code Playgroud)
在您要更新的实体上.您必须实现自己的逻辑来确定是否需要持久化对象.
| 归档时间: |
|
| 查看次数: |
433 次 |
| 最近记录: |