Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.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
Php 实体在表单提交后保存,而不保存_Php_Symfony_Symfony 2.1_Symfony Forms - Fatal编程技术网

Php 实体在表单提交后保存,而不保存

Php 实体在表单提交后保存,而不保存,php,symfony,symfony-2.1,symfony-forms,Php,Symfony,Symfony 2.1,Symfony Forms,我有一个三层的表格 内置验证在某种程度上不是通过所有3个级别触发的。因此,我必须手动检查第三级的错误。如果我发现一个错误,则带有错误的实体不会被持久化。刷新总是在循环结束时触发。不幸的是,即使没有持久化,也会在数据库中保存一些无效的实体。这是我的控制器: $form = $this->createForm(new GameListType(), $betRound); $request = $this->getRequest(); if ($request-

我有一个三层的表格

内置验证在某种程度上不是通过所有3个级别触发的。因此,我必须手动检查第三级的错误。如果我发现一个错误,则带有错误的实体不会被持久化。刷新总是在循环结束时触发。不幸的是,即使没有持久化,也会在数据库中保存一些无效的实体。这是我的控制器:

    $form = $this->createForm(new GameListType(), $betRound);

    $request = $this->getRequest();
    if ($request->getMethod() == 'POST') {
        $form->bind($request);
        $betRound = $form->getData();
        if ($form->isValid()) {
            foreach ($betRound->getGames() as $game) {
                if ($game->hasBet()) {
                    $bet = $game->getBet();
                    // Filter are used during select
                    // , but dont work for inserts
                    // should work in this current context!
                    $bet->setGame($game);
                    $bet->setBetRound($betRound);
                    $bet->setUser($user);

                    $validator = $this->container->get('validator');
                    $errors = $validator->validate($bet);
                    if (count($errors) == 0) {
                        print($bet. ' got persisted'); <-- never triggered
                        $em->persist($bet);
                    } else {
                        // Manual Error Handling 
                        // (no cascade Validation to third level
                        foreach ($errors as $violation) {
                            $form->addError(new FormError(
                                                    $violation->getMessageTemplate(),
                                                    $violation->getMessageParameters(),
                                                    $violation->getMessagePluralization()
                                    ));
                        }
                    }
                }
            } // foreach ($betRound->getGames() as $game)
            $em->flush();

            if(!$form->hasErrors()){
                return $this->redirect($this->generateUrl('betround_show', 
                        array('id' => $betRound->getId())
                        ));
            }
        }
$form=$this->createForm(新GameListType(),$betRound);
$request=$this->getRequest();
如果($request->getMethod()=='POST'){
$form->bind($request);
$betRound=$form->getData();
如果($form->isValid()){
foreach($betRound->getGames()作为$game){
如果($game->hasBet()){
$bet=$game->getBet();
//在选择过程中使用过滤器
//,但不适用于插入
//应该在当前环境下工作!
$bet->setGame($game);
$bet->setBetRound($betRound);
$bet->setUser($user);
$validator=$this->container->get('validator');
$errors=$validator->validate($bet);
如果(计数($errors)==0){
打印($bet.'got persistend');持久($bet);
}否则{
//手动错误处理
//(无三级级联验证)
foreach($errors as$违规){
$form->addError(新FormError)(
$violation->getMessageTemplate(),
$violation->getMessageParameters(),
$违例->getMessagePluralization()
));
}
}
}
}//foreach($betRound->getGames()作为$game)
$em->flush();
如果(!$form->hasErrors()){
返回$this->redirect($this->generateUrl('betround\u show'),
数组('id'=>$betRound->getId())
));
}
}

持久化操作从未触发,但无效的$bet实体仍保存在数据库中。

检查是否有关于游戏和赌注之间关系的级联选项


问题是它真的持续存在还是更新?赌注是否已经存在,如果验证失败,您只是不想更新更改?如果是,您需要做的是在验证失败时使用$em->refresh($bet)撤消更改

您是否有任何LifeCycleArgs可以为您执行此操作?据我所知,还没有一些LifeCycleArgs可以在持久化后添加对赌注实体的修改,但我仍然不知道赌注首先在哪里持久化。在这种情况下,这是我要防止的更新。为什么级联选项相关?我没有级联我的游戏实体y也是。我会尝试刷新,但我仍然不知道,为什么赌注会首先进入更改集中。它会被更改,因为您正在使用$bet->setGame()更改它。同样,如果赌注显示在表单上,则$form->bind也会更改。刷新将从数据库中重新加载原始赌注,并应解决此问题。您还可以使用延迟的显式更改跟踪策略。这要求您保留任何要更新的对象。但您可能不想这样做t、 非常感谢,我使用了刷新,因为它对我来说似乎是最简单的解决方案。