6
votes

Comment mettre à jour une collection multiple d'une entité dans l'auditeur d'événements Onflush?

J'ai cette entité: xxx

et cet écouteur: xxx

et cela fonctionne bien si la collection d'Apple est vide, mais si Il a un élément que j'obtiens une erreur de duplication.

Comment puis-je dire à l'unité de travail que je veux seulement recalculer la collection de porc?

Mise à jour < / P>

Il y a un nouvel événement de préflush ( https://github.com/doctrine/ Doctrine2 / Pull / 169 ) Et je pense que ce genre de choses peut être fait là-bas. Ce pr n'est pas dans la branche que j'utilise mais j'essayons!


0 commentaires

3 Réponses :


7
votes

Lors de la mise à jour d'une entité lors de l'événement ONFLUSH EM> d'un écoute, tout ce que vous devez appeler est ComputerChangeSet () CODE>:

$myNewUserEntity = new Entity\User;
$myNewTagEntity = new Entity\Tag;

$entity->user = $myNewUserEntity;
// make sure you call add() on the owning side for *ToMany associations
$entity->tags->add($myNewTagEntity);

$em->persist($myNewUserEntity);
$em->persist($myNewTagEntity);

$metaUser = $em->getClassMetadata(get_class($myNewUserEntity));
$uow->computeChangeSet($metaUser, $myNewUserEntity);

$metaTag = $em->getClassMetadata(get_class($myNewTagEntity));
$uow->computeChangeSet($metaTag, $myNewTagEntity);

$meta = $em->getClassMetadata(get_class($entity));
$uow->computeChangeSet($meta, $entity);


5 commentaires

Désolé mais le préflush a résolu mon problème. Modification de l'UOW est une sorte de piratage et très désordonné, il peut vous rendre fou de collections.


Coma, je suis d'accord. Vous êtes question était de faire des choses sur Onflush () et je suis le seul moyen de le faire. Si votre cas d'utilisation peut être mis en œuvre en préflush () à la place, c'est génial!


Eh bien ... il semble que l'événement de préflush si attendu fait presque n'importe quoi ... toutes les listes planifiées sont vides.


Désolé d'entendre ça, mais heureuse ma solution a aidé à la fin. BTW, je pense que vous vouliez dire "fait presque rien ";)


Tu es mon héros @dotjon!



1
votes

Ceci peut être fait avec le nouvel événement de préflush (Symfony 2.1).

Ajouter un auditeur à l'événement (est une mauvaise pratique pour injecter tout le conteneur de service, mais est parfois la voie à suivre ): xxx

Et l'auditeur devrait être quelque chose comme: xxx


0 commentaires

0
votes

Lorsque vous souhaitez mettre à jour l'entité actuelle, vous envoyez à Onflush et crée également une association à cette entité

(pour cet exemple, je vais utiliser parent objet et enfant objet)

disons quand je modifie la propriété de l'objet parent "Stressé" sur 1 Je veux également associer une nouvelle enfant objet à l'objet parent dans mon Onflush méthode, il ressemblera à quelque chose comme ceci: xxx

donc là que vous voyez:

  1. Vous devez persister votre objet enfant en utilisant $ UOW-> persister () pas $ em-> persist ()
  2. ComputerChanGeSet sur l'objet enfant.
  3. RecomputeSingleTentityChangeset sur l'objet parent

    Pour obtenir de l'aide pour la création de la méthode OnFlush, veuillez vous reporter à la documentation


0 commentaires