Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Error a la hora de insertar un dato en base de datos con Symfony

3 de abril de 2014

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

#1

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

3 abril 2014, 18:05
#2

Estupendo! ahora lo probaré, pero la solución buena que todo esto son prácticas :)

Gracias!

@ramondevesag

3 abril 2014, 18:34