Foros del Web » Programando para Internet » PHP » Symfony »

Problema con relacion de entidades.

Estas en el tema de Problema con relacion de entidades. en el foro de Symfony en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 08/07/2015, 04:50
 
Fecha de Ingreso: marzo-2015
Mensajes: 29
Antigüedad: 9 años, 1 mes
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
  #2 (permalink)  
Antiguo 08/07/2015, 12:48
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Problema con relacion de entidades.

la solución es que agregues cascade={"persist"} en la relación como te sugiere el error
Código PHP:
Ver original
  1. @ORM\ManyToOne(targetEntity="Agc\ManagerBundle\Entity\Modelo", fetch="EAGER", cascade={"persist"})
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 09/07/2015, 01:14
 
Fecha de Ingreso: marzo-2015
Mensajes: 29
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Problema con relacion de entidades.

Gracias por responder hss, eso es lo que me pide el error si, pero si lo hago, me duplica en la base de datos en la tabla EquipoControl, el equipo insertado, me crea una fila con el modelo seleccionado, y otra fila, con el modelo que me duplica por poner el cascade persist.

Lo unico que necesito es una simple relacion que guarde el id del modelo en mi equipo para saber que modelo es, no duplicarlos.

Gracias por atenderme
  #4 (permalink)  
Antiguo 09/07/2015, 09:25
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Problema con relacion de entidades.

Si te aparece duplicado realiza una depuración de tu código es posible que este usando persist() mas de una vez.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: relacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:03.