关系ManyToOne需要级联持久

时间:2015-07-07 10:12:50

标签: php symfony doctrine

尝试插入新实体时遇到问题。

我有两个实体,EquipoControl和Modelo,关系是:

一个equipoControl可以有一个型号。

这是我与equipoControl的关系

EquipoControl.php

/**
     * @ORM\ManyToOne(targetEntity="Agc\ManagerBundle\Entity\Modelo", fetch="EAGER")
     * @ORM\JoinColumn(name="idModelo", referencedColumnName="idModelo")
     * @Assert\NotNull()
     * @Assert\NotBlank(message = "Por favor, escribe el modelo")
     */
    protected $modelo;

在我的实体模型中,我对这段关系一无所知。

DefaultController

$emDefault = $this->getDoctrine()->getManager();
                $em = $this->getDoctrine()->getManager("customer_1");

                $equipoControl = new EquipoControl();

                $actividad = $em->getRepository('AgcManagerBundle:Actividad')
                                            ->findOneBy(array('idActividad' => $idActividad));

                $formulario = $this->createForm(new EquipoControlType(array()), $equipoControl);

                $formulario->handleRequest($request);//Este metodo asocia los datos del formulario a nuestro objeto

                if ($formulario->isValid()) {
                //$idEquipoControl = $equipoControl->getIdEquipoControl();
                //Necesito comprobar que el equipo no existe y no está instalado en otra actividad
                $equipoControlExiste=$emDefault->getRepository('AgcManagerBundle:EquipoControl')->findOneBy(array('codigo'=>$equipoControl->getCodigo()));
                if (! $equipoControlExiste) {//SI EL EQUIPO NO EXISTE 

                    $equipoControl->setInstaladoEn($user->getAdministracion()->getIdAdministracion()."_".$idActividad);
                    $emDefault->persist($equipoControl);
                    $emDefault->flush();


                    $equipoActividad = new EquiposActividades();
                    $equipoActividad->setEquipoControl($equipoControl);
                    $actividadObj=$em->getRepository('AgcManagerBundle:Actividad')->findOneBy(array('idActividad'=>$idActividad));
                    $equipoActividad->setActividad($actividadObj);
                    $equipoActividad->setIdUsuario($user->getIdUser());
                    $tipoTransmision = new TipoTransmision();
                    $tipoTransmision->setIdTipoTransmision(0);
                    $protocolo = new Protocolo();
                    $protocolo->setIdProtocolo(0);
                    $equipoActividad->setTipoTransmision($tipoTransmision);
                    $equipoActividad->setProtocolo($protocolo);

                    $em->persist($equipoActividad);
                    $em->flush();

                    $message='El equipo se ha instalado convenientemente...Puede realizar su configuración.';
                    $this->get('session')->getFlashBag()->add('success',$message);
                    return $this->redirect($this->generateUrl('agc_asistente_actividad', array("paso" => "4"))."?equipoactividad=".$equipoActividad->getIdEquipoActividad());//Redireccion a otro sitio
                    }

当我在表单中插入新的EquipoControl时,请跳过错误:

  

通过这种关系找到了一个新的实体   那个没有的'Agc \ ManagerBundle \ Entity \ EquipoControl#modelo'   配置为级联实体的持久化操作:ESD 123SR。至   解决此问题:显式调用EntityManager#persist()on   这个未知的实体或配置级联持久存在此关联   映射例如@ManyToOne(..,cascade = {“persist”})。

我不需要坚持,我只想联想

1 个答案:

答案 0 :(得分:0)

您的关联已正确映射。在保留Modelo实体之前,您需要保留EquipoControl实体。

最有可能发生的事情是,与Modelo相关联的EquipoControl尚未存在或尚未保留。因此,学说不能坚持这种关联,并建议你级联

<强>更新

如果您已在数据库中保留Modelo个实体,则需要先加载Modelo,然后将其关联到EquipoControl

<强> 实施例

...
$entityManager = new EntityManager();
$equipo = new EquipoControl();
$modelo = $entityManager->find('Modelo', 1234);
$equipo->setModelo($modelo);
$entityManager->persist();
$entityManager->flush();
...

<强> UPDATE2:

问题是由于您尝试保留EquipoControl具有属性$modelo null的实例。

看起来这句话没有正确填充$equipoControl->modelo属性。

$formulario = $this->createForm(new EquipoControlType(array()), $equipoControl);

您需要从表单中手动提取modelo并将其设置在$equipoControl对象中。