Doctrine 2 Relations entre entités Supprimer
J'ai une entité propriétaire, qui a la relation suivante pour un "attribut" de l'entité:
/**
* @ORM\OneToMany(targetEntity="Attribute", mappedBy="entity", cascade={"persist", "remove", "merge"})
**/
protected $attributes;
Sur le côté, la propriété de l'entité relation ressemble à ceci:
/**
* @ORM\ManyToOne(targetEntity="Entity", inversedBy="attributes")
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id")
*/
protected $entity;
Lorsque je crée une instance d'une entité, d'ajouter des attributs et de l'enregistrer. Tout cela fonctionne très bien.
Lorsque je supprime un attribut de l'entité et de persister, l'attribut n'est pas supprimé dans la base de données et ré-apparaît lors de l'actualisation.
Quelqu'un a une idée?
source d'informationauteur Nicholas Charbonneau
Vous devez vous connecter pour publier un commentaire.
Solution
Ce que vous cherchez est orphelin de suppression.
Vous pouvez lire sur si vous souhaitez des détails sur la raison de votre situation actuelle ne fonctionne pas.
Cascade de malheurs
Le fonctionnement en cascade de ne pas faire ce que vous voulez, malheureusement. La "cascade=[supprimer]" signifie simplement que si l'entité objet est supprimé puis doctrine en boucle à travers et supprimer tous les attributs enfant ainsi:
Comment le faire manuellement
Si vous avez besoin de supprimer un attribut d'une entité, vous auriez supprimer l'attribut de la sorte:
Solution de détails
Mais, pour le faire automatiquement, nous utilisons l'orphelin option de suppression. Nous avons simplement dire à doctrine que les attributs ne peuvent appartenir à des entités, et si un attribut n'appartient plus à une entité, il suffit de le supprimer:
Ensuite, vous pouvez supprimer l'attribut simplement en faisant ceci:
Être prudent lors de l'utilisation d'orphelin de l'enlèvement.
Si vous supprimez un élément, puis appel d'actualisation sur la principale entité de l'élément n'est pas supprimé de l'intérieur orphelin de suppression de tableau de la doctrine.
Et si la rougeur est appelé plus tard, entraînera la suppression de cette entrée à partir de la db, en ignorant l'actualisation.
Cela ressemble à un bug pour moi, et a abouti à la perte d'images sur un grand nombre de produits dans mon application. J'ai dû mettre en place un écouteur pour les appels persistent encore sur ces entités, après la vaisselle prévue pour le supprimer.