Doctrine保存已更改但未保留的实体

时间:2014-06-11 16:55:22

标签: symfony doctrine-orm

我有一个REST Api接受一个批量的实体集合,然后逐个验证它们,以便只保存有效的实体并忽略无效的实体。我试图通过

实现这一目标
foreach($bets['bets'] as $bet){
    $bet['betRound'] = $betRound->getId();
    $bet['user'] = $this->getUser()->getId();
    $betObj = $this->getBetForGame($bet['game']);
    $singleForm = $this->formFactory->create('bet', $betObj);
    $singleForm->submit($bet);
    if($singleForm->isValid()){
        $em->persist($betObj)
    }
}
$em->flush();

这会检查每个实体,只有在有效时才会保留。不知何故,当我提交12个有效实体时,有4个无效实体,刷新仍然提交所有16个并更改数据库值,即使是无效实体也是如此。 有人知道为什么吗?

2 个答案:

答案 0 :(得分:0)

flush()方法将工作单元中的每个更改与数据库同步。尝试单独刷新有效的有效的:

foreach($bets['bets'] as $bet){
    $bet['betRound'] = $betRound->getId();
    $bet['user'] = $this->getUser()->getId();
    $betObj = $this->getBetForGame($bet['game']);
    $singleForm = $this->formFactory->create('bet', $betObj);
    $singleForm->submit($bet);
    if($singleForm->isValid()){
        $em->persist($betObj);
        $em->flush($betObj);
    }
}

我不知道这是不是错字,但你在这里忘记了;

$em->persist($betObj)

答案 1 :(得分:0)

使用$ em-> refresh将任何无效的投注恢复为原始状态。

更新:如果投注对象已经被管理,那么就不需要对它们进行持久调用。

foreach($bets['bets'] as $bet){
    $bet['betRound'] = $betRound->getId();
    ...
    // Basically reloads invalid objects
    if(!$singleForm->isValid()) $em->refresh($betObj);
}
$em->flush();