em-> flush尝试插入另一个表并获取错误

时间:2018-12-10 13:17:02

标签: symfony doctrine-orm

我正在使用Symfony 3.4。我本来想使用全局变量,所以我使用了会话。在默认控制器中

public function indexAction(SessionInterface $session)
{
    //Some code...
    $session->set('uoconnecte', $valeur);
    //Some code...
}

我在另一个控制器中设置了变量

public function newAction(Request $request, SessionInterface $session){}

我得到了足够的值,因为值的die(dump())显示了它。但是$em->flush()何时到来,我不知道为什么它试图插入到$em->persist(Place)中没有提到的另一个表(TypeUO)中,并且这样做会导致错误:

  

使用参数[null,null,null,null]执行'INSERT INTO type_u_o(codeTypeUO,libTypeUO,niveauTypeUO,typeuoliaison_id)VALUES(?,?,?,?)'时发生异常:

     

SQLSTATE [23000]:违反完整性约束:1048列'codeTypeUO'不能为空。”

我要刷新的实体(LieuRangement)与第二个实体(UniteOrganisationnelle)有关系。

/**
 * @ORM\ManyToOne(targetEntity="AdminBundle\Entity\UniteOrganisationnelle", cascade={"persist", "remove"})
 * @ORM\JoinColumn(name="uo_id", referencedColumnName="id",nullable=true)
 */
private $uo;

这是控制器代码的一部分

$em = $this->getDoctrine()->getManager();
        $session = $this->get('session');
        $uo1 = $session->get('uoconnecte');
        $lieuRangement->setUo($uo1);
        $em->persist($lieuRangement);
        //die(dump($lieuRangement->getUo()->getNomUO()));
        $em->flush();

但是当我删除会话变量时,它起作用了。 我该怎么解决?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

通过在会话中传输$uo1变量,EntityManager对此一无所知。用“学说”术语来说,该实体不再受“管理”。因此,EntityManager认为这是一个新实体(即使已设置了主键字段),并尝试将其插入。

请看看https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/cookbook/entities-in-session.html