我有一个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个并更改数据库值,即使是无效实体也是如此。 有人知道为什么吗?
答案 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();