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:
A new entity was found through the relationship 'Agc\ManagerBundle\Entity\EquipoControl#modelo' that was not configured to cascade persist operations for entity: NEW MODE. To solve this issue: Either 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