Estoy trabajando con un proyecto de encuestas en Symfony2 y llevo tiempo intentando solucionar un problema que me trae de cabeza...
Resulta que las encuestas tienen preguntas de distintos tipos, cada una con sus atributos, así que la clase "Pregunta" se divide en subclases. A su vez, las preguntas de selección se dividen en preguntas con una única respuesta y con varias, quedando dos subclases para la clase "Seleccion".
Así pues, tenemos una superclase "Pregunta", con varias subclases, entre ellas la subclase "Seleccion", y ésta tiene dos subclases "SelUnica" y "SelMultiple". El código de estas clases lo adjunto al final.
El problema que tengo es a la hora de recuperar datos en la clase "Seleccion". Los sets que genera Doctrine 2 funcionan correctamente y los datos se guardan correctamente en BBDD. Pero he podido comprobar que los gets no recuperan los datos ya en la entidad, en los gets generados por Doctrine.
Lo único que le veo de especial es que esta clase tiene superclase y subclases. Además solo ocurre con los atributos de la clase, las relaciones se recuperan correctamente porque la clase "Seleccion" está relacionada con "Opcion" y se recuperan correctamente.
A continuación, los códigos de las entidades sin los gets y los sets que genera Doctrine 2:
Clase "Pregunta":
Código PHP:
/**
* @ORM\Entity(repositoryClass="Proyecto\EncuestasBundle\Entity\Repositorios\PreguntaRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="tipo_pregunta", type="string")
* @ORM\DiscriminatorMap({"SU" = "SelUnica", "SM" = "SelMultiple", "VE" = "ValorEntero", "VD" = "ValorDecimal", "TX" = "Texto"})
*/
abstract class Pregunta
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @ORM\Column(type="integer")
* @Assert\Type(type="numeric", message="El campo 'Orden' tiene que ser numérico")
*/
protected $orden;
/**
* @ORM\Column(type="boolean")
* @Assert\Type("boolean")
*/
protected $respuesta_obligatoria;
/**
* @ORM\Column(type="string")
* @Assert\NotBlank(message="El campo 'Texto' es obligatorio")
*/
protected $texto;
/**
* @ORM\ManyToOne(targetEntity="Encuesta", inversedBy="preguntas")
* @ORM\JoinColumn(name="encuesta_id", referencedColumnName="id")
*/
protected $encuesta;
/**** Aquí vendrían los métodos generados por Doctrine ****/
}
Código PHP:
/**
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="tipo_seleccion", type="string")
* @ORM\DiscriminatorMap({"SU" = "SelUnica", "SM" = "SelMultiple"})
*/
abstract class Seleccion extends Pregunta
{
/**
* @ORM\Column(type="string")
* @Assert\Choice({"Horizontal", "Vertical"})
*/
protected $tipo_presentacion;
/**
* @ORM\Column(type="boolean")
* @Assert\Type("boolean")
*/
protected $opciones_con_imagenes;
/**
* @ORM\OneToMany(targetEntity="Opcion", mappedBy="seleccion")
*/
protected $opciones;
/**** Aquí vendrían los métodos generados por Doctrine ****/
}
Código PHP:
/**
* @ORM\Entity
*/
class SelUnica extends Seleccion
{
/**** Aquí vendrían los métodos generados por Doctrine ****/
* Get tipo_pregunta
*
* @var string
*/
public function getTipoPregunta()
{
return 'SU';
}
}
Código PHP:
/**
* @ORM\Entity
*/
class SelMultiple extends Seleccion
{
/**
* @ORM\Column(type="integer", nullable="true")
* @Assert\Type(type="numeric", message="El número mínimo de respuestas tiene que ser numérico")
*/
protected $min_respuestas;
/**
* @ORM\Column(type="integer", nullable="true")
* @Assert\Type(type="numeric", message="El número máximo de respuestas tiene que ser numérico")
*/
protected $max_respuestas;
/**** Metodos generados ****/
* Get tipo_pregunta
*
* @var string
*/
public function getTipoPregunta()
{
return 'SM';
}
}
Un saludo!