Actualmente tengo un modelo de estructura de la siguiente manera:Symfony2/Doctrina asignada superclase en la mitad de la herencia de tablas de clase
/**
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="related_type", type="string")
* @ORM\DiscriminatorMap({"type_one"="TypeOne", "type_two"="TypeTwo"})
*/
abstract class BaseEntity {
... (all the usual stuff, IDs, etc)
/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="baseEntity")
*/
private $comments;
}
/**
* @ORM\Entity
*/
class TypeOne extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class TypeTwo extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class Comment {
... (all the usual stuff, IDs, etc)
/**
* @ORM\ManyToOne(targetEntity="BaseEntity", inversedBy="comments")
*/
private $baseEntity;
}
La idea aquí es ser capaz de atar un comentario a cualquiera de las otras mesas. Todo parece estar funcionando bien hasta ahora (concedido, todavía estoy explorando opciones de diseño, así que podría haber una mejor manera de hacerlo ...), pero lo único que noté es que las subclases tienen algunos campos comunes que me gustaría pasar a una clase común para padres. No quiero moverlos a BaseEntity ya que habrá otros objetos que son hijos de BaseEntity, pero que no tendrán esos campos.
He pensado en la creación de una clase padre MappedSuperclass en el medio, así:
/**
* @ORM\MappedSuperclass
*/
abstract class Common extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class TypeOne extends Common {}
/**
* @ORM\Entity
*/
class TypeTwo extends Common {}
Pensé que esto iba a funcionar, pero el generador de esquema de base de la doctrina se queja de que no puedo tener un mapeo OneToMany en una MappedSuperclass. No esperaba que esto fuera un problema, ya que el mapeo de OneToMany aún se encuentra entre la raíz BaseEntity y la tabla de comentarios. ¿Hay alguna estructura diferente que debería utilizar o alguna otra forma de hacer que estos campos sean comunes sin agregarlos en BaseEntity?
Entiendo que las asociaciones de uno a muchos no son posibles en una superclase mapeada ... sin embargo, mi situación es un poco diferente. Mi estructura propuesta es BaseEntity (una entidad real) -> MappedSuperclass -> GrandchildrenEntities (también entidades). La asociación de uno a muchos se encuentra entre BaseEntity y otra Entity. Por lo tanto, técnicamente, la asociación no es una MappedSuperclass ya que la superclase mapeada es un elemento secundario de BaseEntity y no contiene la asociación de uno a muchos. – cdwhatcott
ver mi respuesta actualizada – KTastrophy
Gracias por la actualización. Después de haber pasado algún tiempo trabajando en otras cosas y luego volviendo a este problema, creo que la mejor opción sería hacer una entidad 'común' como sugeriría. – cdwhatcott