Symfony2 / Doctrine mappé super-classe dans le milieu de la classe de l'héritage de table
J'ai actuellement un modèle de structure comme suit:
/**
* @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;
}
L'idée ici est d'être en mesure de lier un commentaire pour les autres tables. Tout cela semble fonctionner ok jusqu'à présent (certes, je suis encore à explorer des options de conception, donc il pourrait y avoir une meilleure façon de le faire...), mais la seule chose que j'ai remarqué, c'est que les sous-classes ont en commun certaines de champs que j'aimerais déménager dans une commune de la classe parent. Je ne veux pas les déplacer vers le haut dans le BaseEntity qu'il y aura d'autres objets qui sont des enfants de BaseEntity, mais qui n'aura pas ces champs.
J'ai réfléchi à la création d'un MappedSuperclass classe parent dans le milieu, comme suit:
/**
* @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 {}
J'ai pensé que ce serait le travail, mais la doctrine schéma de base de données du générateur est de se plaindre que je ne peux pas avoir un OneToMany de cartographie sur un MappedSuperclass. Je ne m'attendais pas que cela soit un problème comme le OneToMany la cartographie est toujours entre la racine BaseEntity et le Commentaire de la table. Est-il une structure différente, je devrais être de l'utiliser, ou d'autre manière de rendre ces champs communs sans les ajouter sur le BaseEntity?
OriginalL'auteur cdwhatcott | 2012-08-30
Vous devez vous connecter pour publier un commentaire.
De la documentation:
Cela dit, comment pouvez-vous associer une entité avec celui qui ne l'est pas?
Plus de la documentation:
Source: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html
Mise à jour
Parce que votre MappedSuperClass s'étend BaseEntity il hérite également du BaseEntity associations, comme s'il s'agissait de ses propres. Si vous avez un OneToMany sur un MappedSuperClass.
Pour obtenir autour d'elle, eh bien, vous auriez besoin de modifier ou d'étendre la doctrine de travailler comme vous le souhaitez.
Aussi loin que la fonctionnalité native va vous disposez de deux options:
Classe De L'Héritage De Table
Vous Commun de la classe et de la DB de la représentation aurait les zones communes et les classes enfant va maintenant seulement les champs spécifiques à eux-mêmes. Malheureusement, cela peut être une fausse déclaration de vos données si vous êtes tout simplement en essayant de regrouper les champs communs pour le bien de leur regroupement.
En Commun une Entité
Il semble que toutes les Mappé avec une Super-Classe est une Entité qui n'est pas représenté dans la DB. Donc, faire une Entité à la place. L'inconvénient est que vous vous retrouverez avec une table DB, mais vous pourriez tout simplement supprimer.
Je vous conseille de prendre un second regard sur vos données et vous assurer que vous ne sont que champs de regroupement si elles sont communes à la fois de nom et de l'objet. Par exemple, un ComputerBox, une Boîte à chaussures, un Homme et une Femme peuvent tous avoir la "hauteur" de la propriété, mais dans ce cas, je ne dirais pas avoir une classe Commune, avec une "hauteur" de la propriété qu'ils héritent tous de. Au lieu de cela, j'aurais une Boîte avec des champs communs à ComputerBox et de Boîte à chaussures et j'aimerais avoir une Personne avec des champs communs à l'Homme et de la Femme. Dans cette situation de Classe de l'Héritage de Table ou table unique si vous préférez fonctionne parfaitement.
Si vos données en suit que l'exemple aller avec une Seule Table ou la Classe de l'Héritage de Table. Si non, pourrais-je vous conseille de ne pas regrouper les champs.
voir ma réponse mis à jour
Merci pour la mise à jour. Après avoir passé quelques temps à travailler sur d'autres choses et puis de revenir à ce problème, je pense que la meilleure option serait de faire un "Commun" d'une entité comme vous le suggérez.
OriginalL'auteur KTastrophy