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

Consulta DQL no devuelve un valor

Estas en el tema de Consulta DQL no devuelve un valor en el foro de Symfony en Foros del Web. Hola comunidad, tengo una consulta dql en donde devuelvo todo lo que necesito para evitar el lazy loading pero resulta que el ultimo valor que ...
  #1 (permalink)  
Antiguo 08/05/2013, 15:46
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Consulta DQL no devuelve un valor

Hola comunidad, tengo una consulta dql en donde devuelvo todo lo que necesito para evitar el lazy loading pero resulta que el ultimo valor que devuelve la consulta no es un objeto con todas sus propiedades,le falta una propiedad. Sin mas le dejo la consulta y las Entitades
Código:
class Serie
{
    /**
    * @ORM\OneToMany(targetEntity="SerieGenero", mappedBy="serie")
    */
    protected $generos;
}
Código:
class SerieGenero
{
    /**
     * @var integer
     *
     * @ORM\Id     
     * @ORM\ManyToOne(targetEntity="Serie", inversedBy="generos")
     * @ORM\JoinColumn(name="serie_id", referencedColumnName="id", onDelete="Cascade")
     */
    private $serie;

    /**
     * @var integer
     *
     * @ORM\Id     
     * @ORM\ManyToOne(targetEntity="Genero", inversedBy="series")
     * @ORM\JoinColumn(name="genero_id", referencedColumnName="id", onDelete="Cascade")   
     */
    private $genero;
}
Código:
class SerieGenero
{
    /**
     * @var integer
     *
     * @ORM\Id     
     * @ORM\ManyToOne(targetEntity="Serie", inversedBy="generos")
     * @ORM\JoinColumn(name="serie_id", referencedColumnName="id", onDelete="Cascade")
     */
    private $serie;

    /**
     * @var integer
     *
     * @ORM\Id     
     * @ORM\ManyToOne(targetEntity="Genero", inversedBy="series")
     * @ORM\JoinColumn(name="genero_id", referencedColumnName="id", onDelete="Cascade")   
     */
    private $genero;
}
Código PHP:
Ver original
  1. <?php
  2.      
  3.         public function getSeriesConCapitulosById($id)
  4.         {
  5.             $em = $this->getEntityManager();
  6.            
  7.             $consulta = $em->createQuery('
  8.                SELECT s, c, gs, g
  9.                FROM BackendBundle:Serie s LEFT JOIN s.capitulos c JOIN s.generos gs JOIN gs.genero g
  10.                WHERE s.id = :id
  11.            ');        
  12.             $consulta->setParameter('id', $id);
  13.             return $consulta->getOneOrNullResult();
  14.         }
  15.      
  16.     ?>
Esta consulta devuelve las series con sus capítulos, con los objetos géneros y dentro de géneros los objetos genero. Pues resulta que cuando recorro los géneros, dentro de un for la ultima instancia de géneros no contiene la relación con genero, me da un error llamando a los métodos necesarios.
Que puede estar dando este error?
saludos y gracias de antemano
  #2 (permalink)  
Antiguo 09/05/2013, 11:24
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 23
Respuesta: Consulta DQL no devuelve un valor

Hola,

Una consulta, porque tienes varios "@ORM\Id" en una misma entidad? la idea es tener solo un ID unico

Y lo otro, en tus entidades las propiedades deben ser de tipo "protected" NO "private"
Código:
protected $generos; CORRECTO 

Código:
private $genero; MAL 
Saludos
  #3 (permalink)  
Antiguo 09/05/2013, 12:03
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Consulta DQL no devuelve un valor

@fhederico, en realidad Doctrine soporta composite keys y para esto se utilizan múltiples @Id, a nivel de Doctrine el mapeo con varios @Id es correcto, ahora no si esa es la intención del OP y las propiedades no es obligatorio que sean protected lo que si es obligatorio es que no sean public.

@daymerrf, estas seguro que la serie en cuestion tiene genero asociado ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 09/05/2013, 12:48
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 23
Respuesta: Consulta DQL no devuelve un valor

@masterpuppet, si es logico que soporte varios, pero me referia asi es lo que el requeria.

Y sobre "protected", si tienes propiedades definidas como "protected" y otras como "private" al hacer cruces te lanza una excepcion.

Saludos
  #5 (permalink)  
Antiguo 09/05/2013, 12:57
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

Explicando un poco mejor. La entidad SerieGenero es la resultante de una relación de ManyToMany entre Serie y Genero. Como es posible que en un futuro esa relación de mucho a mucho contenta nuevos atributos esta diseñada de esa forma la entidad SerieGenero. Ahora ya he estado investigando y debug en el problema. Resulta en la misma consulta estoy devolviendo ademas los capítulos de cada serie. El problema que me esta dando es que cuando obtengo los géneros de cada serie, Doctrine me devuelve una colección de los mismo, pero el ultimo que me devuelve esta en null, por eso cuando esta dentro de un for que llamo a los métodos me da el error que no existen, es un objeto nulo, no puede tener métodos, pero eso solo pasa cuando las series tienen menos de dos capítulos asociados, Todas las series que tengan mas de un capitulo, en el momento que hago la consulta doctrrine devuelve la colección de objetos correctas sin que falte ninguno, hasta ahora esto es todo lo que he podido encontrar. Espero que silga de algo para la solución al problema. Gracias a todos por su ayuda
  #6 (permalink)  
Antiguo 09/05/2013, 12:59
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

@fhederico, no se si el error pueda ser por eso, pero voy a poner todos como private.
  #7 (permalink)  
Antiguo 09/05/2013, 13:02
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 23
Respuesta: Consulta DQL no devuelve un valor

@daymerrf, una mera pregunta, iniciaste ese elemento en el contructor como array? por ejemplo

Código HTML:
Ver original
  1. public function __construct()
  2.     {
  3.         $this->holaaaa = new \Doctrine\Common\Collections\ArrayCollection();
  4.     }

Con esto aceptara una coleccion de elementos y en caso de que no tenga, te mostrara una coleccion vacia, no "null"

Y yo los dejaria como protected, pero si te funciona bien asi, dejalo asi ;)
  #8 (permalink)  
Antiguo 09/05/2013, 13:15
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Consulta DQL no devuelve un valor

@fhederico, de tus comentarios yo honestamente entiendo otra cosa, pero bueno, lo importante es quede claro, y sobre la visibilidad, mientras respetes las reglas de PHP y que a su vez no sea public no deberías tener problemas.

@daymerrf, postea las entidades completas, las que intervienen en el DQL que muestras.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 09/05/2013, 14:09
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 23
Respuesta: Consulta DQL no devuelve un valor

Hahahahaha si, me explique horrible, mis disculpas por ello
  #10 (permalink)  
Antiguo 09/05/2013, 14:17
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

Código:
<?php

class Serie
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nombre", type="string", length=255)
     */
    private $nombre;

    /**
     * @var string
     *
     * @ORM\Column(name="imagen", type="string", length=255)
     * @Assert\Image(maxSize = "1M")
     * @Assert\NotBlank()
     */
    private $imagen;

    /**
     * @var string
     *
     * @ORM\Column(name="sinopsis", type="text")
     */
    private $sinopsis;

    /**
     * @var \string
     *
     * @ORM\Column(name="ano_publicacion", type="string", length=4, nullable=true)
     */
    private $ano_publicacion;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="fecha_culminacion", type="datetime", nullable=true)
     */
    private $fecha_culminacion;

    /**
     * @var string
     *
     * @ORM\Column(name="creador", type="string", length=255,  nullable=true)
     */
    private $creador;
     
    /**
     * @var string
     *
     * @ORM\Column(name="slug", type="string", length=255)
     */
    private $slug;
    
    /**
     * @ORM\OneToMany(targetEntity="Capitulo", mappedBy="serie")
     */
    protected $capitulos;

     /**
     * @ORM\OneToOne(targetEntity="slider")     
     */
    protected $slider;
    
    /**
    * @ORM\OneToMany(targetEntity="SerieGenero", mappedBy="serie")
    */
    protected $generos;
    
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Serie
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;
    
        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    /**
     * Set imagen
     *
     * @param string $imagen
     * @return Serie
     */
    public function setImagen($imagen)
    {
        $this->imagen = $imagen;
    
        return $this;
    }

    /**
     * Get imagen
     *
     * @return string 
     */
    public function getImagen()
    {
        return $this->imagen;
    }

    /**
     * Set sinopsis
     *
     * @param string $sinopsis
     * @return Serie
     */
    public function setSinopsis($sinopsis)
    {
        $this->sinopsis = $sinopsis;
    
        return $this;
    }

    /**
     * Get sinopsis
     *
     * @return string 
     */
    public function getSinopsis()
    {
        return $this->sinopsis;
    }

    /**
     * Set ano_publicacion
     *
     * @param \DateTime $anoPublicacion
     * @return Serie
     */
    public function setAnoPublicacion($anoPublicacion)
    {
        $this->ano_publicacion = $anoPublicacion;
    
        return $this;
    }

    /**
     * Get ano_publicacion
     *
     * @return \DateTime 
     */
    public function getAnoPublicacion()
    {
        return $this->ano_publicacion;
    }

    /**
     * Set fecha_culminacion
     *
     * @param \DateTime $fechaCulminacion
     * @return Serie
     */
    public function setFechaCulminacion($fechaCulminacion)
    {
        $this->fecha_culminacion = $fechaCulminacion;
    
        return $this;
    }

    /**
     * Get fecha_culminacion
     *
     * @return \DateTime 
     */
    public function getFechaCulminacion()
    {
        return $this->fecha_culminacion;
    }

    /**
     * Set creador
     *
     * @param string $creador
     * @return Serie
     */
    public function setCreador($creador)
    {
        $this->creador = $creador;
    
        return $this;
    }

    /**
     * Get creador
     *
     * @return string 
     */
    public function getCreador()
    {
        return $this->creador;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->capitulos = new \Doctrine\Common\Collections\ArrayCollection();
    }
    
    /**
     * Add capitulos
     *
     * @param \Animes\BackendBundle\Entity\Capitulo $capitulos
     * @return Serie
     */
    public function addCapitulo(\Animes\BackendBundle\Entity\Capitulo $capitulos)
    {
        $this->capitulos[] = $capitulos;
    
        return $this;
    }

    /**
     * Remove capitulos
     *
     * @param \Animes\BackendBundle\Entity\Capitulo $capitulos
     */
    public function removeCapitulo(\Animes\BackendBundle\Entity\Capitulo $capitulos)
    {
        $this->capitulos->removeElement($capitulos);
    }

    /**
     * Get capitulos
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getCapitulos()
    {
        return $this->capitulos;
    }
    
    public function __toString() {
        return $this->nombre;
    }

    /**
     * Set slug
     *
     * @param string $slug
     * @return Serie
     */
    public function setSlug($slug)
    {
        $this->slug = $slug;
    
        return $this;
    }

    /**
     * Get slug
     *
     * @return string 
     */
    public function getSlug()
    {
        return $this->slug;
    }
    
    /**
     * Set slider
     *
     * @param \Animes\BackendBundle\Entity\slider $slider
     * @return Serie
     */
    public function setSlider(\Animes\BackendBundle\Entity\slider $slider = null)
    {
        $this->slider = $slider;
    
        return $this;
    }

    /**
     * Get slider
     *
     * @return \Animes\BackendBundle\Entity\slider 
     */
    public function getSlider()
    {
        return $this->slider;
    }

    /**
     * Add generos
     *
     * @param \Animes\BackendBundle\Entity\SerieGenero $generos
     * @return Serie
     */
    public function addGenero(\Animes\BackendBundle\Entity\SerieGenero $generos)
    {
        $this->generos[] = $generos;
    
        return $this;
    }

    /**
     * Remove generos
     *
     * @param \Animes\BackendBundle\Entity\SerieGenero $generos
     */
    public function removeGenero(\Animes\BackendBundle\Entity\SerieGenero $generos)
    {
        $this->generos->removeElement($generos);
    }

    /**
     * Get generos
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getGeneros()
    {
        return $this->generos;
    }
}
Código:
class SerieGenero
{
    /**
     * @var integer
     *
     * @ORM\Id     
     * @ORM\ManyToOne(targetEntity="Serie", inversedBy="generos") 
     * @ORM\JoinColumn(name="serie_id", referencedColumnName="id", onDelete="Cascade")
     */
    private $serie;

    /**
     * @var integer
     * 
     * @ORM\Id     
     * @ORM\ManyToOne(targetEntity="Genero", inversedBy="series")
     * @ORM\JoinColumn(name="genero_id", referencedColumnName="id", onDelete="Cascade")   
     */ 
    private $genero;
   

    /**
     * Set serie
     *
     * @param \Animes\BackendBundle\Entity\Serie $serie
     * @return SerieGenero
     */
    public function setSerie(\Animes\BackendBundle\Entity\Serie $serie)
    {
        $this->serie = $serie;
    
        return $this;
    }

    /**
     * Get serie
     *
     * @return \Animes\BackendBundle\Entity\Serie 
     */
    public function getSerie()
    {
        return $this->serie;
    }

    /**
     * Set genero
     *
     * @param \Animes\BackendBundle\Entity\Genero $genero
     * @return SerieGenero
     */
    public function setGenero(\Animes\BackendBundle\Entity\Genero $genero)
    {
        $this->genero = $genero;
    
        return $this;
    }

    /**
     * Get genero
     *
     * @return \Animes\BackendBundle\Entity\Genero 
     */
    public function getGenero()
    {
        return $this->genero;
    }
}
  #11 (permalink)  
Antiguo 09/05/2013, 14:17
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

Código:
class Capitulo
{   
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

   
    /**
     * @var string
     *
     * @ORM\Column(name="descripcion", type="text", nullable=true)
     */
    private $descripcion;
    
    /**
     * @var string
     *
     * @ORM\Column(name="nombre_original", type="string", length=255)    
     */
    private $nombre_original;

    /**
     * @var integer
     *
     * @ORM\Column(name="cantidad_vista", type="integer")
     */
    private $cantidad_vista;

    /**
    * @ORM\ManyToOne(targetEntity="Serie", inversedBy="capitulos")
    * @ORM\JoinColumn(name="serie_id", referencedColumnName="id", onDelete="Cascade")
    * @Assert\NotBlank()
    */
    private $serie;

     /**
     * @var string
     *
     * @ORM\Column(name="capitulo", type="string", length=255)
     * @Assert\NotBlank()
     * @Assert\File(maxSize = "200M", mimeTypes = {"video/webm", "application/octet-stream"})
     */
    private $capitulo;
    
    /**
     * @var \DateTime
     *
     * @ORM\Column(name="fecha", type="datetime")
     */
    private $fecha;
    
    /**
     * @var integer
     *      
     * @ORM\OneToMany(targetEntity="Animes\FrontendBundle\Entity\Comentario", mappedBy="capitulo")       
     */
    private $comentarios;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    
    /**
     * Set descripcion
     *
     * @param string $descripcion
     * @return Capitulo
     */
    public function setDescripcion($descripcion)
    {
        $this->descripcion = $descripcion;
    
        return $this;
    }

    /**
     * Get descripcion
     *
     * @return string 
     */
    public function getDescripcion()
    {
        return $this->descripcion;
    }    

    /**
     * Set cantidad_vista
     *
     * @param integer $cantidadVista
     * @return Capitulo
     */
    public function setCantidadVista($cantidadVista)
    {
        $this->cantidad_vista = $cantidadVista;
    
        return $this;
    }

    /**
     * Get cantidad_vista
     *
     * @return integer 
     */
    public function getCantidadVista()
    {
        return $this->cantidad_vista;
    }

    /**
     * Set serie
     *
     * @param \Animes\BackendBundle\Entity\Serie $serie
     * @return Capitulo
     */
    public function setSerie(\Animes\BackendBundle\Entity\Serie $serie = null)
    {
        $this->serie = $serie;
    
        return $this;
    }

    /**
     * Get serie
     *
     * @return \Animes\BackendBundle\Entity\Serie 
     */
    public function getSerie()
    {
        return $this->serie;
    }

    /**
     * Set capitulo
     *
     * @param string $capitulo
     * @return Capitulo
     */
    public function setCapitulo($capitulo)
    {
        $this->capitulo = $capitulo;
    
        return $this;
    }

    /**
     * Get capitulo
     *
     * @return string 
     */
    public function getCapitulo()
    {
        return $this->capitulo;
    }
    /**
     * Set nombre_original
     *
     * @param string $nombreOriginal
     * @return Capitulo
     */
    public function setNombreOriginal($nombreOriginal)
    {
        $this->nombre_original = $nombreOriginal;
    
        return $this;
    }

    /**
     * Get nombre_original
     *
     * @return string 
     */
    public function getNombreOriginal()
    {
        return $this->nombre_original;
    }

    /**
     * Set fecha
     *
     * @param \DateTime $fecha
     * @return Capitulo
     */
    public function setFecha($fecha)
    {
        $this->fecha = $fecha;
    
        return $this;
    }

    /**
     * Get fecha
     *
     * @return \DateTime 
     */
    public function getFecha()
    {
        return $this->fecha;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->comentarios = new \Doctrine\Common\Collections\ArrayCollection();
    }
    
    /**
     * Add comentarios
     *
     * @param \Animes\FrontendBundle\Entity\Comentario $comentarios
     * @return Capitulo
     */
    public function addComentario(\Animes\FrontendBundle\Entity\Comentario $comentarios)
    {
        $this->comentarios[] = $comentarios;
    
        return $this;
    }

    /**
     * Remove comentarios
     *
     * @param \Animes\FrontendBundle\Entity\Comentario $comentarios
     */
    public function removeComentario(\Animes\FrontendBundle\Entity\Comentario $comentarios)
    {
        $this->comentarios->removeElement($comentarios);
    }

    /**
     * Get comentarios
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getComentarios()
    {
        return $this->comentarios;
    }
    
    public function __toString() {
        return $this->getNombreOriginal();
    }
}
Código:
class Genero
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="genero", type="string", length=255)
     */
    private $genero;

    /**
     * @var string
     *
     * @ORM\Column(name="descripcion", type="text",  nullable=true)
     */
    private $descripcion;

    /**
    * @ORM\OneToMany(targetEntity="SerieGenero", mappedBy="genero")
    */
    protected $series;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set genero
     *
     * @param string $genero
     * @return Genero
     */
    public function setGenero($genero)
    {
        $this->genero = $genero;
    
        return $this;
    }

    /**
     * Get genero
     *
     * @return string 
     */
    public function getGenero()
    {
        return $this->genero;
    }

    /**
     * Set descripcion
     *
     * @param string $descripcion
     * @return Genero
     */
    public function setDescripcion($descripcion)
    {
        $this->descripcion = $descripcion;
    
        return $this;
    }

    /**
     * Get descripcion
     *
     * @return string 
     */
    public function getDescripcion()
    {
        return $this->descripcion;
    }
    
    public function __toString() {
        return $this->genero;
    }
}
  #12 (permalink)  
Antiguo 11/05/2013, 23:32
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 23
Respuesta: Consulta DQL no devuelve un valor

Cita:
Iniciado por fhederico Ver Mensaje
@daymerrf, una mera pregunta, iniciaste ese elemento en el contructor como array? por ejemplo

Código HTML:
Ver original
  1. public function __construct()
  2.     {
  3.         $this->holaaaa = new \Doctrine\Common\Collections\ArrayCollection();
  4.     }

Con esto aceptara una coleccion de elementos y en caso de que no tenga, te mostrara una coleccion vacia, no "null"

Hola,

Probaste esto?

Lo otro, hay un comando en Symfony que te genera los getter y setter y demaces cosas en tus entidades, solo declaras las propiedades, que tipo son y los metodos los crea solo

Código HTML:
Ver original
  1. php app/console doctrine:generate:entities -> Genera Todas
  2.  
  3. php app/console doctrine:generate:entities  RUTABUNDLE:NOMBREENTIDAD-> Genera para una sola




Saludos
  #13 (permalink)  
Antiguo 12/05/2013, 12:00
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

Ya lo probe y sigue dando el mismo error, en verdad el problema esta en cuando la serie tienes menos de dos capitulos, porque si tiene uno, me sigue dando el problema. La inicializacion de la variable en el constructor estaria bien si no tuviera ningun capitulo, pero cuando tiene uno solo me sigue dando el problema
  #14 (permalink)  
Antiguo 13/05/2013, 23:08
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 23
Respuesta: Consulta DQL no devuelve un valor

Si te esta dando error aun cuando tienes uno, puedes poner el codigo de donde lo llamas y donde lo cargas?

Si tiene un capitulo, te sigue poniendo null cierto? sorry, que me meto cuando ya voy a dormir, asi que ando a 10%
  #15 (permalink)  
Antiguo 14/05/2013, 12:42
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

Código PHP:
Ver original
  1. $em = $this->getDoctrine()->getEntityManager();
  2.         $serie = $em->getRepository('BackendBundle:Serie')->getSeriesConCapitulosById($id);                
  3.      
  4.         if(!$serie)
  5.              throw $this->createNotFoundException ('No existe ninguna serie con el id: '.$id);                
  6.        
  7.         $generos = $em->getRepository('BackendBundle:Genero')->getGenerosBySerie($serie);
  8.         $idsGeneros = array();                
  9.        
  10.         foreach($generos as $genero)
  11.         {
  12.             $idsGeneros[] =$genero->getGenero->getId();
  13.         }

dentro del foreach la ultima instancia no tiene el método getGenero(), en fin no tienen nada esta vacía, y entonces me da el error
  #16 (permalink)  
Antiguo 15/05/2013, 12:37
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 23
Respuesta: Consulta DQL no devuelve un valor

Primero, te recomiendo que instales el Bundle

https://github.com/raulfraile/LadybugBundle

Es MUY util para debugear y ver los metodos que tiene una entidad y sus relaciones.


Y segundo, obtienes las Series, pero porque despues vuelves a obtener los generos? una de las grandes ventajas que tiene Doctrine, es que crea un mapa gigante, si tienes unidas dos entidades puedes llamar a esta otra con la primera, me explico:

Realizaste una consulta "serie" y esta deberia retornarte una entidad (asumiendo que hiciste un simple select s from BUNDLE:Serie s), esto obviamente puede retornarte 1 valor o varios (si te retorna un array lo recorres con un foreach), bueno, el tema es que teniendo tu entidad serie llamas a Genero, y te retornara todos los cruces

Código:
$serie->getGenero() //Asumiendo que tu metodo getter se llame asi en la entidad "SERIE" 
Con esto estas dentro de la entidad genero y puedes ocupar los metodos que esta tenga, por ejemplo

Código:
$serie->getGenero->getId()
Con esto te ahorras esa nueva consulta que haces, y te mostrara lo mismo que deseas.

Espero haberme explicado bien

Saludos

EDITO:

En tus entidades a "seriegenero" le llamas "genero" (se presta para confusion, deberias llamarlas "seriegenero"), pero lo que te digo es lo mismo, puedes llamar a "getSerieGenero" y ocupar los metodos que este tenga y los cruces con otras entidades que este ocupe

Última edición por fhederico; 15/05/2013 a las 12:48
  #17 (permalink)  
Antiguo 15/05/2013, 12:50
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

Voy a instalar en Bundle que me recomiendas para ver cual puede ser el error, por otro lado devuelvo todo en la consulta para evitar el Lazy Loading y Cuando llamo al método Serie->getGenero() aquí obtengo la entidad SerieGenero y luego para obtener en genero como tal tengo que llamar al método getGenero de la entidad SerieGenero, por eso es que esta el código de la siguiente forma
Código PHP:
Ver original
  1. $serie->getGenero->getGenero()->getId();
  #18 (permalink)  
Antiguo 06/03/2014, 10:21
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

Hola, se que este tema es un poco antiguo y al final no pudimos solucionarlo, pero resulta que estoy trabajando en un nuevo proyecto y nuevamente vuelvo a chocar con el mismo problema. Quisiera esta vez poder solucionar el problema y en vez de abrir un nuevo tema seguiré este que mantiene la misma idea. Bueno resulta que en este caso Tengo la Entidad Hostal y una relación de M:M con Servicio, de esta relación he creado manualmente la Entidad HostalServicio, Realizo una consulta en donde devuelvo todo lo que necesito para evitar el Lazy Loading. Aquí les dejo la consulta:
Código PHP:
public function queryHostales()
    {
        
$em $this->getEntityManager();        
        
$consulta $em->createQuery('
            SELECT h, sh, s
            FROM BackendBundle:Hostal h JOIN h.servicios sh JOIN sh.servicio s
            ORDER BY h.nombre ASC, s.nombre ASC            
        '
);
        return 
$consulta;
    } 
Y cuando empiezo a mostrar los servicios en la vista me devuelve el ultimo valor null, es decir de los servicios que tiene un hostal el ultimo es null. Les voy a dejar a continuación las tres entidades y el debug de la vista para que puedan obsérvalo a lujo de detalles. Espero que me puedan seguir ayudando y poder solucionar este problema de una vez y por todas.

Código PHP:
<?php

namespace HostalesBackendBundleEntity
;

use 
DoctrineORMMapping as ORM;
use 
SymfonyComponentValidatorConstraints as Assert;

/**
 * Hostal
 *
 * @ORM\Table(name="hostal")
 * @ORM\Entity(repositoryClass="Hostales\BackendBundle\Entity\HostalRepository")
 */
class Hostal
{
    
/**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    
private $id;

    
/**
     * @var string
     *
     * @ORM\Column(name="nombre", type="string", length=255, nullable=false)
     * @Assert\NotBlank()
     */
    
private $nombre;

    
/**
     * @var string
     *
     * @ORM\Column(name="direccion", type="string", length=255, nullable=false)
     * @Assert\NotBlank()
     */
    
private $direccion;

    
/**
     * @var string
     *
     * @ORM\Column(name="imagen", type="string", length=255, nullable=false)
     * @Assert\Image(maxSize = "1M")
     */
    
private $imagen;

    
/**
     * @var string
     *
     * @ORM\Column(name="banner", type="string", length=255, nullable=true)
     * @Assert\Image(maxSize = "1M")
     */
    
private $banner;

    
/**     
     *
     * @ORM\ManyToOne(targetEntity="Municipio")
     * @ORM\JoinColumn(name="municipio_id", referencedColumnName="id", onDelete="Cascade")
     */
    
private $municipio;

    
/**
     * @var string
     *
     * @ORM\Column(name="correo", type="string", length=255, nullable=true)
     */
    
private $correo;
    
     
/**
     * @var string
     *
     * @ORM\Column(name="descripcion", type="text", nullable=false)
     * @Assert\NotBlank()
     */
    
private $descripcion;
    
    
/**
     * @var integer
     *
     * @ORM\Column(name="prioridad", type="integer", nullable=false)
     * @Assert\NotBlank()
     * @Assert\Regex("/^[0-9]{1,3}$/")
     */
    
private $prioridad;
    
    
/**
     * @var servicios
     *
     * @ORM\OneToMany(targetEntity="HostalServicio", mappedBy="hostal", cascade={"persist"})     
     */
    
private $servicios;

    
/**
     * Get id
     *
     * @return integer 
     */
    
public function getId()
    {
        return 
$this->id;
    }

    
/**
     * Set nombre
     *
     * @param string $nombre
     * @return Hostal
     */
    
public function setNombre($nombre)
    {
        
$this->nombre $nombre;
    
        return 
$this;
    }

    
/**
     * Get nombre
     *
     * @return string 
     */
    
public function getNombre()
    {
        return 
$this->nombre;
    }

    
/**
     * Set direccion
     *
     * @param string $direccion
     * @return Hostal
     */
    
public function setDireccion($direccion)
    {
        
$this->direccion $direccion;
    
        return 
$this;
    }

    
/**
     * Get direccion
     *
     * @return string 
     */
    
public function getDireccion()
    {
        return 
$this->direccion;
    }

    
/**
     * Set imagen
     *
     * @param string $imagen
     * @return Hostal
     */
    
public function setImagen($imagen)
    {
        
$this->imagen $imagen;
    
        return 
$this;
    }

    
/**
     * Get imagen
     *
     * @return string 
     */
    
public function getImagen()
    {
        return 
$this->imagen;
    }

    
/**
     * Set banner
     *
     * @param string $banner
     * @return Hostal
     */
    
public function setBanner($banner)
    {
        
$this->banner $banner;
    
        return 
$this;
    }

    
/**
     * Get banner
     *
     * @return string 
     */
    
public function getBanner()
    {
        return 
$this->banner;
    }
    
    
/**
     * Set correo
     *
     * @param string $correo
     * @return Hostal
     */
    
public function setCorreo($correo)
    {
        
$this->correo $correo;
    
        return 
$this;
    }

    
/**
     * Get correo
     *
     * @return string 
     */
    
public function getCorreo()
    {
        return 
$this->correo;
    }

    
/**
     * Set municipio
     *
     * @param \Hostales\BackendBundle\Entity\Municipio $municipio
     * @return Hostal
     */
    
public function setMunicipio(HostalesBackendBundleEntityMunicipio $municipio)
    {
        
$this->municipio $municipio;
    
        return 
$this;
    }

    
/**
     * Get municipio
     *
     * @return \Hostales\BackendBundle\Entity\Municipio 
     */
    
public function getMunicipio()
    {
        return 
$this->municipio;
    }
    
    public function 
subirImagen($dir)
    {
        
$nombreImagen uniqid('hostal-').'.'.$this->imagen->guessExtension();
        
$this->imagen->move($dir$nombreImagen);
        
$this->setImagen($nombreImagen);
    }
    
    public function 
subirBanner($dir)
    {
        if(
$this->banner === null)
            return;
        
$nombreImagen uniqid('banner-').'.'.$this->banner->guessExtension();
        
$this->banner->move($dir$nombreImagen);
        
$this->setBanner($nombreImagen);
    }
    
    public function 
__toString() {
        return 
$this->nombre;
    }

    
/**
     * Set descripcion
     *
     * @param string $descripcion
     * @return Hostal
     */
    
public function setDescripcion($descripcion)
    {
        
$this->descripcion $descripcion;

        return 
$this;
    }

    
/**
     * Get descripcion
     *
     * @return string 
     */
    
public function getDescripcion()
    {
        return 
$this->descripcion;
    }

    
/**
     * Set prioridad
     *
     * @param integer $prioridad
     * @return Hostal
     */
    
public function setPrioridad($prioridad)
    {
        
$this->prioridad $prioridad;

        return 
$this;
    }

    
/**
     * Get prioridad
     *
     * @return integer 
     */
    
public function getPrioridad()
    {
        return 
$this->prioridad;
    }
    
/**
     * Constructor
     */
    
public function __construct()
    {
        
$this->servicios = new DoctrineCommonCollectionsArrayCollection();
    }

    
/**
     * Add servicios
     *
     * @param \Hostales\BackendBundle\Entity\HostalServicio $servicios
     * @return Hostal
     */
    
public function addServicio(HostalesBackendBundleEntityHostalServicio $servicios)
    {
        
$this->servicios[] = $servicios;

        return 
$this;
    }

    
/**
     * Remove servicios
     *
     * @param \Hostales\BackendBundle\Entity\HostalServicio $servicios
     */
    
public function removeServicio(HostalesBackendBundleEntityHostalServicio $servicios)
    {
        
$this->servicios->removeElement($servicios);
    }

    
/**
     * Get servicios
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    
public function getServicios()
    {
        return 
$this->servicios;
    }
}
Código PHP:
<?php

namespace HostalesBackendBundleEntity
;

use 
DoctrineORMMapping as ORM;

/**
 * Servicio
 *
 * @ORM\Table(name="servicio")
 * @ORM\Entity(repositoryClass="Hostales\BackendBundle\Entity\ServicioRepository")
 */
class Servicio
{
    
/**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    
private $id;

    
/**
     * @var string
     *
     * @ORM\Column(name="nombre", type="string", length=255, nullable=true)
     */
    
private $nombre;

    
/**
     * @var string
     *
     * @ORM\Column(name="imagen", type="string", length=255, nullable=true)
     */
    
private $imagen;    
    
   
/**
     * Get id
     *
     * @return integer 
     */
    
public function getId()
    {
        return 
$this->id;
    }

    
/**
     * Set nombre
     *
     * @param string $nombre
     * @return Servicio
     */
    
public function setNombre($nombre)
    {
        
$this->nombre $nombre;

        return 
$this;
    }

    
/**
     * Get nombre
     *
     * @return string 
     */
    
public function getNombre()
    {
        return 
$this->nombre;
    }

    
/**
     * Set imagen
     *
     * @param string $imagen
     * @return Servicio
     */
    
public function setImagen($imagen)
    {
        
$this->imagen $imagen;

        return 
$this;
    }

    
/**
     * Get imagen
     *
     * @return string 
     */
    
public function getImagen()
    {
        return 
$this->imagen;
    }
    
    public function 
subirImagen($dir)
    {
        
$nombreImagen uniqid('servicio-').'.'.$this->imagen->guessExtension();
        
$this->imagen->move($dir$nombreImagen);
        
$this->setImagen($nombreImagen);
    }
    
    public function 
__toString() {
        return 
$this->nombre;
    }   
}
  #19 (permalink)  
Antiguo 06/03/2014, 10:41
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Consulta DQL no devuelve un valor

Código PHP:
<?php

namespace HostalesBackendBundleEntity
;

use 
DoctrineORMMapping as ORM;

/**
 * HostalServicio
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Hostales\BackendBundle\Entity\HostalServicioRepository")
 */
class HostalServicio
{
    
/**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Hostal", inversedBy="servicios", cascade={"persist"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="hostal_id", referencedColumnName="id", onDelete="Cascade")
     * })
     */
     
    
private $hostal;

    
/**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Servicio")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="servicio_id", referencedColumnName="id", onDelete="Cascade")
     * })
     */
    
private $servicio;
    

    
/**
     * Set hostal
     *
     * @param \Hostales\BackendBundle\Entity\Hostal $hostal
     * @return HostalServicio
     */
    
public function setHostal(HostalesBackendBundleEntityHostal $hostal)
    {
        
$this->hostal $hostal;

        return 
$this;
    }

    
/**
     * Get hostal
     *
     * @return \Hostales\BackendBundle\Entity\Hostal 
     */
    
public function getHostal()
    {
        return 
$this->hostal;
    }

    
/**
     * Set servicio
     *
     * @param \Hostales\BackendBundle\Entity\Servicio $servicio
     * @return HostalServicio
     */
    
public function setServicio(HostalesBackendBundleEntityServicio $servicio)
    {
        
$this->servicio $servicio;

        return 
$this;
    }

    
/**
     * Get servicio
     *
     * @return \Hostales\BackendBundle\Entity\Servicio 
     */
    
public function getServicio()
    {
        return 
$this->servicio;
    }
}
Y en esta imagen ven como el último servicio es null

Etiquetas: devuelve, valor
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 23:30.