Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 条令保存已更改但未保留的实体_Symfony_Doctrine Orm - Fatal编程技术网

Symfony 条令保存已更改但未保留的实体

Symfony 条令保存已更改但未保留的实体,symfony,doctrine-orm,Symfony,Doctrine Orm,我有一个RESTAPI,它接受大量实体集合,然后逐个验证它们,以便只保存有效的实体,而忽略无效的实体。我试图通过以下方式实现这一目标: foreach($bets['bets'] as $bet){ $bet['betRound'] = $betRound->getId(); $bet['user'] = $this->getUser()->getId(); $betObj = $this->getBetForGame($bet['game']);

我有一个RESTAPI,它接受大量实体集合,然后逐个验证它们,以便只保存有效的实体,而忽略无效的实体。我试图通过以下方式实现这一目标:

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个无效实体时,flush仍在提交所有16个实体,并更改数据库值,即使是无效的实体。 有人知道为什么吗?

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->refresh将所有无效赌注恢复到原始状态

更新:如果已在管理赌注对象,则无需对其调用persist

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

我构建了一个与此非常类似的解决方案,但不是刷新实体,而是分离实体。我不确定这是否对我的情况有很大影响。我想看看哪种方法更快会很有趣。这是我最初的想法,但出于性能原因,我不喜欢多次刷新。
foreach($bets['bets'] as $bet){
    $bet['betRound'] = $betRound->getId();
    ...
    // Basically reloads invalid objects
    if(!$singleForm->isValid()) $em->refresh($betObj);
}
$em->flush();