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