Comment (si possible du tout) modifiez-vous le type d'entité avec Doctrine2 en utilisant son héritage de la table de classe? p>
Disons que j'ai une personne Y a-t-il un moyen simple de le faire avec Doctrine2? P> personne code> type parent et deux types hérités
employeur code> et
client code>. Mon système permet de créer une personne et de spécifier son type - c'est assez facile à mettre en œuvre - mais j'aimerais également pouvoir modifier la personne d'un employé à un client, tout en maintenant la personne code> - Informations de niveau (ID ID et autres enregistrements associés). P>
4 Réponses :
en doctrine2, lorsque vous avez votre classe d'entité parent, et sous des classes telles que Lorsque vous instaniez doctrine2 vérifie votre Ainsi, lorsque vous décidez d'avoir une instance de suivant ces principes, doctrine2 créera une instance pour Vous aussi longtemps que vous avez déclaré les paramètres dans le espoir qui aide. C'est tout dans le Documentation bien que p> p> personne code> défini comme suit:
Client code> défini Comme: p>
personne code> comme: p>
@DiscriminatorMapap code> Énoncé (ci-dessus) pour un mappage correspondant à
Personne code> et lorsque trouvé, crée une valeur de chaîne dans la colonne Table enfoncée dans
@discriminatorcolumn code> ci-dessus. < / p>
Client code> comme: p>
@DiscriminatorMap code>. Une entrée sera également faite sur la table code> de la personne code>, dans la colonne discriminatoire em> pour refléter ce type de classe d'entité qui vient d'être instancié. P>
Peut-être que ma question n'était pas assez claire mais j'aimerais lancer i> une entité d'un type dans un autre type (c.-à-d. Client -> employé) tout en conservant les données générales relatives à la superclasse (personne ici ). En outre, j'utilise un héritage de table unique pour celui-ci (pas de table multiple)
Je cherchais ce comportement hier aussi. p>
À la fin, après avoir parlé avec des personnes à #Doctrine sur Freenode, on m'a dit que ce n'est pas possible. p>
Si vous voulez faire cela, vous devez passer à travers ceci: p>
Employee Code> Table de cette héritage. Li>
ol>
Suppression de l'héritage h2>
De même si vous voulez supprimer l'héritage, vous devez .. p>
- saisir l'entité de la personne. LI>
- Mettez à jour la colonne discriminator pour qu'il ne soit plus un «employé» et la modifier à une «personne». Li>
- Supprimez la ligne correspondante dans votre code> Table de l'employé code>. (Oui, vous devez le supprimer, changez simplement que le discriminateur Coumn n'est pas suffisant). li>
ol>
Cela pourrait être de 7 mois de retard, mais c'est au moins la bonne réponse pour tout ce qui cherche à suporter une telle fonctionnalité. p>
Impressionnant. J'ai fini par n'utiliser pas CTI pour ce problème spécifique, mais cela pourrait effectivement être nécessaire quelque while =)
Qu'en est-il de rafraîchir l'entité? Si vous avez déjà chargé l'entité utilisateur, la valeur discriminatrice manuelle ne fera pas partie de l'entité utilisateur déjà chargée gérée par l'unité de travail. Donc, l'entité utilisateur sera toujours considérée comme l'ancien type. $ em-> Actualiser ($ utilisateur); ne marche pas. Alors, comment faire face à ce problème?
php n'a pas de support pour la coulée d'objet, la doctrine ne le supporte pas. Pour contourner le problème, j'écris cette méthode statique dans les classes parent:
$employe = New Employe(); $client = Client::castToMe($employe);
Vous pouvez faire quelque chose comme ça, cependant:
Ce trait peut être utilisé sur votre classes de référentiel: P>
namespace App\Doctrine\Repository; trait DiscriminatorTrait { abstract public function getClassMetadata(); abstract public function getEntityManager(); private function updateDiscriminatorColumn($id, $class) { $classMetadata = $this->getClassMetadata(); if (!in_array($class, $classMetadata->discriminatorMap)) { throw new \Exception("invalid discriminator class: " . $class); } $identifier = $classMetadata->fieldMappings[$classMetadata->identifier[0]]["columnName"]; $column = $classMetadata->discriminatorColumn["fieldName"]; $value = array_search($class, $classMetadata->discriminatorMap); $connection = $this->getEntityManager()->getConnection(); $connection->update( $classMetadata->table["name"], [$column => $value], [$identifier => $id] ); } }