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

Retornar un objeto con QueryBuilder

5 de febrero de 2016

Hola tomo esta pregunta del foro

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);

el tema es que estoy dentro de una claste de tipo Repository de una Entidad y no puedo llamar a $this->getDoctrine() desde ahi

si hago

$dql = "SELECT u FROM AppBundle:User u";
        $dql .= " Where  u.id =" . $user_id;
        $query = $this->getEntityManager()->createQuery($dql)->getResult();

Como puedo hacer para devuelva una instancia de un objeto similar al código de mas arriba???


Respuestas

#1

Hola @xub,

En primer lugar, la mejor forma de hacer lo que describes en la primera parte, es usando la anotación ParamConverter, con esto te ahorras una líneas. En algunas partes he leído que no es recomendable hacerlo y en otras la recomiendan. Yo lo recomiendo.

De esta forma tu pasas el parámetro que necesitas en la ruta y Symfony hace la magia. No tienes la necesidad de usar el $request dentro del controlador. Aquí un ejemplo:

/**
     * @Route("/{proyecto}", name="category_show")
     * @Method("GET")
     */
    public function ???Action(Proyecto $proyecto)
    {
    ...
    $tarea->setProyecto($proyecto);
    ...
    }

Para la segunda duda, tienes que pasar el objeto como parámetro del método que vas a usar y luego colocarlo como parámetro de la DQL.

public function consulta($id)
{
  $query = $this->getEntityManager()->createQuery(
    "SELECT u FROM AppBundle:User u WHERE u.id =: id"
    )->setParameter('id', $id);
 
  return $query->getResult();
}

En este caso pasas solo el ID.

Espero sea de ayuda,

@miguelplazasr

5 febrero 2016, 23:39