Doctrine2 - 仅更新已更改的实体

时间:2014-03-05 20:23:35

标签: php symfony doctrine-orm

在Symfony中,我必须显示一个最多可包含800多个字段的表单,所有这些字段都是复选框,以便计算给定月份的出勤率。我很清楚,如果我发送表单并执行更新,我将只有800多个更新语句(不包括任何可能的插入),这是不可取的,因为它在内存和时间方面可能表现不佳。 / p>

我知道Doctrine可以管理Lifecycle Callbacks,但我对它们缺乏经验,我相信解决方案就在这里。如果实体的值未更改,如何取消标记实体以进行合并?

1 个答案:

答案 0 :(得分:0)

我最近遇到过这种情况,它帮助了我类似的情况。您将要使用的是doctrine实体管理器事务功能。类似的东西:

//Controller Action
$form = $this->createForm(new YourFormType);
if($request->isMethod('post')){
    $form->handleRequest($request);
    if($form->isValid())
    {
        $data = $form->getNormData();
        //If you have some other way of getting all your data use that

        $em = $this->getDoctrine()->getManager();

        $em->transactional(function($em) use($data){
            foreach($data as $user){
                $attendance = new Attendance(new \DateTime);
                //Total assumption on how you handle attendance
                $user->addAttendance($attendance);
                $em->flush();
            }
        });

    }
}

这会将您的所有更新整合到一个事务中,并且如果失败也会处理还原。

有关详细信息,请查看http://docs.doctrine-project.org/en/2.0.x/reference/transactions-and-concurrency.html