Buenas, pues siguiendo un poco el libro de Javier he intentado utilizar un ejemplo para llevarlo a mi proyecto. En concreto he utilizado la idea de unir dos tablas, en el libro Ciudad
y Tienda
mediante un join, en mi caso Proyecto
y Tarea
.
Mi idea es la de crear un pequeño formulario en el cual se genera una tarea que está destinada a un proyecto. Todo me lo almacena bien, excepto el proyecto. Mediante HTML he creado un <select>
con un <option>
donde se desplega todos los proyectos ya creados para seleccionar uno y relacionar este.
El problema lo tengo a la hora de guardar los datos. Symfony me devuelve el siguiente error:
ContextErrorException: Catchable Fatal Error: Argument 1 passed to ...\Entity\Tareas::setProyecto() must be an instance of ...\Entity\Proyectos, integer given, called in .../Controller/DefaultController.php on line 49 and defined in .../Entity/Tareas.php line 146
Las entidades están exactamente igual que en el libro de Javier, y las veo bien, mi pensamiento es que el problema lo tengo en el controlador:
$idProyecto = $request->request->get('idProyecto'); $nombre = $request->request->get('nombre'); $descripcion = $request->request->get('descripcion'); $fechaIni = $request->request->get('fechaIni'); $fechaFin = $request->request->get('fechaFin'); $tarea = new Tareas(); $tarea->setProyecto($idProyecto); $tarea->setNombre($nombre); $tarea->setDescripcion($descripcion); $tarea->setFechaIni(new \DateTime($fechaIni)); $tarea->setFechaFin(new \DateTime($fechaFin)); $em = $this->getDoctrine()->getManager(); $em->persist($tarea); $em->flush();
¡Gracias y un saludo!
Respuestas
El error se produce porque Doctrine espera que al método setProyecto()
le pases un objeto de tipo Proyecto
y le estás pasando un número entero (que es el id
del proyecto).
La solución rápida consiste en buscar el proyecto a partir de su id
y pasárselo al método:
$idProyecto = $request->request->get('idProyecto'); $proyecto = $this->getDoctrine() ->getRepository('AcmeNombreBundle:Proyecto') ->find($idProyecto) ; $tarea->setProyecto($proyecto);
La solución buena consiste en crear el formulario con el componente Form de Symfony2 y definir el campo Proyecto
con el tipo de campo Entity que hace una consulta a la base de datos con Doctrine y te muestra y guarda bien la información sin que tú tengas que hacer nada.
@javiereguiluz
Estupendo! ahora lo probaré, pero la solución buena que todo esto son prácticas :)
Gracias!
@ramondevesag