Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/07/2015, 04:50
dawivan
 
Fecha de Ingreso: marzo-2015
Mensajes: 29
Antigüedad: 9 años, 8 meses
Puntos: 0
Problema con relacion de entidades.

Hola a todos, estoy teniendo un problema con dos entidades asociadas que lleva dos dias calentandome la cabeza.
El caso es que tengo dos entidades, EquipoControl y Modelo.

Un EquipoControl tiene asociado un solo modelo, y a un Modelo pueden estar asociados varios EquipoControl.

Pues bien hasta aqui todo claro.

Cuando relleno el formulario me aparece el siguiente error al enviarlo:

Código PHP:
new entity was found through the relationship 'Agc\ManagerBundle\Entity\EquipoControl#modelo' that was not configured to cascade persist operations for entity: NEW MODETo solve this issueEither explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). 
El EquipoControl se inserta en la BD, pero me lanza este error, y si le pongo cascade={persist}, me duplica la entrada de modelo seleccionada en el formulario, y no es lo que quiero.

Lo que necesito simplemente es asociarlos, el equipoControl X tiene asociado el modelo X, simplemente, no que me cree un nuevo modelo.

A continuacion muestro mi codigo:

En mi entidad EquipoControl creo la asociacion como siempre he echo, de la siguiente manera:

Código 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
En la entidad Modelo no tengo nada relacionado con la asociación.

Vale, tengo mi formulario para crear un EquipoControl nuevo, con el siguiente codigo:

Código PHP:
class EquipoControlType extends AbstractType
{
    public function 
__construct($options) {
        
$this->typeOptions $options;
    }

    public function 
buildForm(FormBuilderInterface $builder, array $options)
    {
        
$builder
            
->add('codigo','text', array('label'=>'Código del equipo.''required' => true))
            ->
add('numeroSerie','text', array('label' => 'Número de serie''required' => true))
            ->
add('fechaAlta','hidden',array('label'=>' ','data'=>date('Y-m-d')))
            ->
add('modelo','entity', array(
                
'em'=> 'default',
                
'class' => 'AgcManagerBundle:Modelo',
                
'required' => true));
    }

    public function 
getDefaultOptions(array $options)
    {
        
$options parent::getDefaultOptions($options);

        return 
$options;
    }

    public function 
setDefaultOptions(OptionsResolverInterface $resolver)
    {
        
$resolver->setDefaults(array(
            
'data_class' => 'Agc\ManagerBundle\Entity\EquipoControl',
            
'entity_manager' => 'default'

        
));
    }

    public function 
getName()
    {
        return 
'agc_managerbundleequipocontroltype';
    }

Y mi controlador, el que se encarga de insertarlo hace lo siguiente:

Código PHP:
$idActividad $request->query->get('actividad');
                
                
$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
                    
} else {
                        if (
$equipoControlExiste->getInstaladoEn()!='') {//SI EXISTE, Y ADEMAS ESTA INSTALADO
                            
$message='El equipo ya está instalado en otra actividad. Por favor contacte con el gestor si cree que debería estar disponible';
                            
$this->get('session')->getFlashBag()->add('warning',$message);
                            return 
$this->redirect($this->generateUrl('agc_asistente_actividad', array("paso" => "3"))."?actividad=".$idActividad);//Redireccion a otro sitio
                        
} else {// SI EXISTE, PERO NO ESTA INSTALADO
                            
$equipoActividad = new EquiposActividades();
                            
$equipoActividad->setEquipoControl($equipoControlExiste);
                            
$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();
                            
$equipoControl->setInstaladoEn($user->getAdministracion()->getIdAdministracion()."_".$idActividad);
                            
$em->persist($equipoControl);
                            
$em->flush();
                            
$message='El equipo ya existía y 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
                        
}
                    }
                }
                
                
$data = array('form' => $formulario->createView(), "actividad" => $actividad);
                return 
$this->render('AgcBackendBundle:asistente:paso3.html.twig'$data); 
Gracias espero vuestras respuestas